2

重複の可能性:
C++: これを削除しますか?

ヒープ上に作成されたクラス Foobar があります。アプリケーションが死んだら終了したい。die() 関数を呼び出すと、死ぬ必要があります。ヒープに作成されたプライベート プロパティがいくつかあります。それらも削除する必要があります。私はそのコードを書きました:

Foobar::Foobar()
{
    m_var = new int(1);
}

Foobar::~Foobar()
{
    delete m_var;
    exit(0);
}

void Foobar::die()
{
    delete this;
}

質問はdelete this並んでいます。呼べばFoobar::~Foobar()呼ばれるか呼ばないか?

PSより良い解決策があれば、それを提案してください。

4

4 に答える 4

2

はい。deleteデストラクタを呼び出します。

このSO スレッドを読むことにも興味があるかもしれません。


于 2012-12-11T09:37:44.157 に答える
2

オブジェクトが動的に割り当てられていると仮定すると、newはい、delete thisデストラクタが呼び出されます。ただし、削除には細心の注意を払う必要がありますthis。特に、後続の操作でクラスのメンバーにアクセスしようとしないようにする必要があります。

また、これが動的に割り当てられていない (つまり を使用してnew)メモリに対して実行されると、未定義の動作が発生します。実際、オブジェクトが 経由で割り当てられた場合、これも未定義の動作につながりますnew[]

詳細については、次のリンクを参照してください: http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15

それに関する別のSOの質問があります: 削除は許可されていますか?

于 2012-12-11T09:38:56.377 に答える
1

いいえ。これは保証されません。を使用して作成されたdeleteことが確実な場合にのみ呼び出す必要があります。thisnew

したがって、現在のオブジェクトがどのように作成されたかによって、デストラクタが呼び出される場合と呼び出されない場合があります。

したがって、「Foobar」オブジェクトがスタック上に作成されたと仮定します (つまり、なしでnew)。次にdelete this、未定義の動作があります。

OTOH は、'new' を使用して作成された場合、delete this安全であり、デストラクタを呼び出します。

于 2012-12-11T09:51:54.637 に答える
0

それは変数が定義される方法に完全に依存します。変数がnewキーワードで定義されている必要があります。そうでない場合、 deleteはコンストラクターを呼び出しません。したがって、変数を次のように宣言します。foobar a = new foobar();

于 2012-12-11T10:01:27.807 に答える