9

このコードを見てください:

class test
{
    public:
        test() { cout << "Constructor" << endl; };
        virtual ~test() { cout << "Destructor" << endl; };
};

int main(int argc, char* argv[])
{
    test* t = new test();
    delete(t);
    list<test*> l;
    l.push_back(DNEW test());
    cout << l.size() << endl;
    l.clear();
    cout << l.size() << endl;
}

次に、この出力を見てください。

    Constructor
    Destructor
    Contructor
    1
    0

問題は、リスト要素のデストラクタが at で呼び出されないのはなぜl.clear()ですか?

4

2 に答える 2

14

あなたのリストはポインタです。ポインタにはデストラクタがありません。デストラクタを呼び出したい場合は、list<test>代わりに試してください。

于 2012-09-30T22:14:11.900 に答える
4

を使用してポインターを解放deleteするか、それを抽象化するもの (スマート ポインターやポインター コンテナーなど) を使用する代わりに、スタック上にオブジェクトを直接作成することをお勧めします。

よりも優先する必要がありtest t;ますtest * t = new test();。スマートまたはその他のリソースを所有するポインターを処理することはほとんどありません。

std::list要素へのポインターではなく、「実際の」要素を使用する場合、この問題は発生しません。

于 2012-10-01T02:19:25.617 に答える