-1

Solaris で実行するコードで purify を実行すると、大量のメモリ リークが発生します。しかし、コードを確認したところ、ほとんどのリークは無効のようです。

たとえば、

File1.cpp

Obj* getMyObj()
{
    Obj* obj = NULL;
    if(condition)
    {
        obj = new Obj();   //Purify is reporting leak here
        //Fill obj
    }

    ...
    return obj;
}

File2.cpp

void myfunc()
{
    Obj* myobj = getMyObj();

   if(myobj == NULL)
       return;
    ...
    ...

    delete myobj;    //The object is deleted here
}

でオブジェクトが適切に破棄されているのにFile2.cpp、なぜ で浄化レポートがリークするのFile1.cppですか?

編集

NULL チェックは単なるタイプミスでした。修正しました。

4

3 に答える 3

2

File2.cppではちゃんとオブジェクトが破棄されているのに、[…]

この仮定は間違っています。

Obj* myobj = getMyObj();

実際にオブジェクトgetMyObjを作成すると、null ポインターは返されません。これは、次の条件ifが真であり、関数がすぐに戻ることを意味します。

if(myobj)
    return;

その関数ではそれ以上コードが実行されないため、破棄されることはありません。

この種のエラーはすぐになくなるため、この種の手動管理の代わりにスマート ポインターを使用することをお勧めします。C++11 では を使用できますがstd::unique_ptr、それ以外の場合std::auto_ptrは注意すれば使用できます。

于 2012-07-31T04:38:23.730 に答える
0

file1.cpp

Obj* getMyObj();

関数の呼び出し元は、返されたオブジェクトを削除する必要があることを知る必要があるため、関数は一種の安全ではありませんが、関数からそれが必要であることが明確ではありません。

生のポインタの代わりにshared_ptrのようなスマートポインタを使用する方が良いでしょう。そうすれば、返されるオブジェクトがヒープに割り当てられ、それがどのように破棄されるか(割り当てられている場合)が明らかになります。

std::shared_ptr<Obj> getMyObj();
于 2012-07-31T04:56:16.293 に答える
0
if(myobj)
   return;

オブジェクトが作成された後、戻りが続行され、削除は実行されませんでした

コードを変更する必要があります:

-if(myobj)
+if(myobj==NULL)
于 2012-07-31T04:37:54.693 に答える