5

の定義some_classは次のとおりです。

class some_class
{
   // stuff

public:
   ~some_class()
   {
         delete dynamic_three;
   }

private:
   classA one;
   classB two;
   classC* dynamic_three;
}

オブジェクトの存続期間が終了すると、その破棄は次のようになります。(1)デストラクタを呼び出し、(2)クラス定義で宣言されているのと同じ順序(=メモリ内の位置)でサブオブジェクトを破棄します。

しかし、私がそのようなものを持っている場合:

auto* ptr = new some_class();

// more stuff

ptr->~some_class(); // l. X

ステップ(2)も実現されていますか?つまり、X行では、サブオブジェクトのデストラクタも呼び出されますか、some_classそれともデストラクタの本体のみが実行されますか?

4

3 に答える 3

2

ステップ(2)も実現されていますか?

はい、保証されています。動作は安全ですが、あなたの場合、最初に配置を介してオブジェクトを再構築せずにオブジェクトのメモリを安全に再利用する方法がないことに注意してください-新規(operator newオブジェクトをオーバーロードし、メモリがどのように割り当てられたかを保証できる場合を除く)一致する割り当て解除を使用します)。

于 2013-03-12T18:01:04.427 に答える
2

テストをしましょう:

class classA
{
public:
    ~classA() { cout << "~classA()" << endl; }
};

class classB
{
public:
    ~classB() { cout << "~classB()" << endl; }
};

class some_class
{
public:
    ~some_class() { cout << "~some_class()" << endl; }

private:
    classA one;
    classB two;
};

int main()
{
    cout << "Start..." << endl;
 
    auto* ptr = new some_class();

    ptr->~some_class();

    cout << "End." << endl;
}

出力:

始める...

~some_class()

~classB()

~classA()

終わり。

したがって、すべてのデストラクタが逆の順序で呼び出されます。

于 2013-03-12T18:07:24.810 に答える
1

オブジェクトの有効期間が終了すると、その破棄は、(1) そのデストラクタを呼び出すこと、および (2) クラス定義で宣言されているのと同じ順序でそのサブオブジェクトを破棄すること (= メモリ内の位置) です。

(3) 割り当てられたメモリが解放されます。

ステップ(2)も実現?

ステップ (2) はい、ステップ (3) はありません。

でも書けるなら

auto* ptr = new some_class();

あなたも書くことができることに注意してください

std::unique_ptr<ptr> ptr (new some_class());

これはあなたを呼びdeleteます(もちろん、これがあなたのニーズに合っている場合にのみこれを使用してください。しかし、あなたが確信が持てない場合はデフォルトでこれを使用してください)。

于 2013-03-12T18:01:34.440 に答える