4

私はその概念に慣れていないので、私に負担をかけないでください。このコードがデストラクタ呼び出しを生成しないのはなぜですか? クラスの名前は一目瞭然です。SString は ~SString() にメッセージを出力します。1 つのデストラクタ メッセージのみを出力します。

int main(int argc, TCHAR* argv[])
{
smart_ptr<SString> smt(new SString("not lost"));
 new smart_ptr<SString>(new SString("but lost")); 
return 0;
}

これはメモリリークですか?impl。smart_ptr は こちらから

編集:

//copy ctor
    smart_ptr(const smart_ptr<T>& ptrCopy) 
    {
        m_AutoPtr = new T(ptrCopy.get());
    }
    //overloading = operator
    smart_ptr<T>& operator=(smart_ptr<T>& ptrCopy) 
    {
        if(m_AutoPtr)
            delete m_AutoPtr;
        m_AutoPtr = new T(*ptrCopy.get());
        return *this;
    }
4

4 に答える 4

8

new smart_ptr<SString>(new SString("but lost"));動的に割り当てられた新しいスマート ポインターを作成していることになります。割り当ての結果 ( a から ashared_ptrへのポインターSString) をどこにも保存しません。ぶら下がっています...結果を保存しないため、それを呼び出すこともできませんdelete-したがって、デストラクタは呼び出されません、そしてSString含まれているオブジェクトのデストラクタも呼び出されません!

試してみると

smart_ptr<SString> *p = new smart_ptr<SString>(new SString("but lost")); 
delete p;

代わりに、この場合にも呼び出されるデストラクタが表示されます。

ただし、それは a の賢明な使用法ではありませんsmart_ptr。手動で呼び出す必要がないsmart_ptrように作成されました。したがって、そのように使用しないでください。最初のステートメントのように使用してください。delete

于 2012-09-14T14:26:41.813 に答える
8

スマート ポインターのポイントは、自動スマート ポインター オブジェクトのみを使用することになっていることです。

{
    smart_ptr<Foo> p(new Foo);
}
// bye bye Foo

しかし、あなたの 2 行目は動的なスマート ポインターを作成し、その寿命は尽きることがありません! したがって、担当しているオブジェクトを破壊する機会はありません。

オブジェクトをクリーンアップできるように、スマート ポインター自体を手動で削除する必要があります。

auto sp = new smart_ptr<Foo>(new Foo);
//                           ^^^^^^^
//        ^^^^^^^^^^^^^^           +------< dynamic Foo, handled by the SP
//                     |
//                     +---------------< dynamic smart pointer, handled by YOU

delete sp;
于 2012-09-14T14:26:49.790 に答える
5

はい、スマートポイント自体がリークされています。(そしてそれが参照を保持するものすべて)。

newスマートポインターの正当な理由が思い浮かびません...

于 2012-09-14T14:26:24.893 に答える
3

はい、これはメモリ リークです。2 番目のスマート ポインタとその内容がリークしています。

その理由は、最初のスマート ポインターがスタック上に作成されるため、そのライフタイムは宣言されているブロックに限定され、その後は自動的に破棄されるためです。

delete2 つ目はヒープ上に作成されます。つまり、そのデストラクタが呼び出される時点で破棄するまで存続します(それにより、SString保持されているのデストラクタが呼び出されます)。

于 2012-09-14T14:27:53.967 に答える