2

デモンストレーションのために、この単純なコンソール アプリケーションを作成しました。

#include <iostream>

class Person {
public:
    int mAge;
};

int main(int argc, const char * argv[])
{
    Person *iPerson = new Person();
    iPerson->mAge = 15;

    std::cout << "Age: " << iPerson->mAge;
    return 0;
}

ここで、Valgrind と CPP Check がリークを特定することを認識していますが、Apple のインストゥルメントをテストすると、このコードをプロファイリングすると、リークは見られません。これは、iPerson が削除されていないにもかかわらずです。

4

3 に答える 3

1

私はそれを解決しました:

  • スナップショット間隔を 1 秒に設定する必要がありました。
  • リリース バージョン (プロファイリングが行われる) の最適化を無効にする (None に設定する) 必要がありました。

次に、ジャスティンの返信とこの質問に基づいて、コードを次のように変更する必要がありました。

#include <iostream>
#include <unistd.h>

class Person {
public:
    int mAge;
};

void CreateLeaks()
{
    // All three lines will generate a leak.
    Person *iPerson = new Person();
    iPerson = new Person();
    iPerson = new Person();
}

int main(int argc, const char * argv[])
{
    CreateLeaks();

    sleep( 2 );
    return 0;
}

まだいくつかの奇妙なことが起こっています。たとえば、sleep(2)内 で追加を開始した場合CreateLeaks、Instruments はすべてのリークをキャッチするわけではありません (sleepコマンドを配置する場所によって異なります。奇妙です。

于 2012-11-12T23:20:42.533 に答える
0

Mac Developer Library のTips for Improving Leak Detectionを参照してください。

C/C++ コード用のCppcheck静的解析ツールも役立つ場合があります。あなたが提供した例では、次のことがわかります。

#>cppcheck  so_code.cpp
Checking so_code.cpp...
[so_code.cpp:15]: (error) Memory leak: iPerson
于 2012-11-11T06:25:37.390 に答える