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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
moba
記事: 82
登録日時: 9年前

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

#1

投稿記事 by moba » 9年前

お世話になります_(._.)_
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;
}

yuni

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

#2

投稿記事 by yuni » 9年前

こんにちは。

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

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

moba
記事: 82
登録日時: 9年前

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

#3

投稿記事 by moba » 9年前

こんにちは。ご回答ありがとうございました。

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る