ページ 11

[C++]自壊と配置new、自動的な開放?

Posted: 2016年4月28日(木) 21:57
by moba
お世話になります_(._.)_
picojsonというパーサを読んでいます。
分からないのは、以下に該当するコードです。deleteしていないのに、配置newしたオブジェクトがメモリリークしないのはなぜなのでしょうか。

コード:

template<typename T>
inline void _parse( value& out, input<T>& in ) {
	out = value();
}

コード:

class value {
	~value();
	value& operator= ( const value& x );
};

inline value& value::operator= ( const value& x ) {
	if( this != &x ){
		this->~value();
		new (this) value(x); // thisの寿命はどうなる?
	}
	return *this;
}

Re: [C++]自壊と配置new、自動的な開放?

Posted: 2016年4月29日(金) 13:47
by yuni
こんにちは。

配置new(プレースメントnew)の理解がまだ追いついていない状態でしょうか…?
これはメモリを確保しているわけではないですよ。
指定したメモリをクラスで初期化しているだけです。
memsetなどに近い、と言えば伝わるでしょうか?

やっていることを文章で説明すると、
「thisとxが違うものである場合、デストラクタを呼んだ後に
xを引数としてnewで初期化(コンストラクタの呼び出しなど)し、thisを返却する」
というものかと思います。

Re: [C++]自壊と配置new、自動的な開放?

Posted: 2016年4月29日(金) 17:35
by moba
こんにちは。ご回答ありがとうございました。

> 配置new
引数の位置に領域を確保する、という意味のwebの文だけを読んで誤解していました。
(最後まで読めば全く違うことが書いてあったのですが…)

それと、デストラクタの明示的な呼び出しを誤解していました。
deleteと混同し、デストラクタを呼べば寿命になるのかと思っていました。

中身がすり替わっているのに、同じ領域を使っているから、元のオブジェクトのoperator delete(?)で開放できてしまうのが面白かったです。