【问题标题】:Instruments does not catch undeleted objects when program terminates程序终止时 Instruments 不会捕获未删除的对象
【发布时间】:2012-10-30 22:38:03
【问题描述】:

为了演示,我创建了这个简单的控制台应用程序:

#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 从未被删除。

【问题讨论】:

  • 在我的机器上,valgrind 正确检测到“肯定丢失:1 个块中的 4 个字节”...
  • 您使用什么程序?甚至不需要工具来查看泄漏...
  • @MFH - 这实际上是一个简单的案例来证明我没有得到任何未删除的对象的任何东西。实际问题涉及一个相当大的框架和一个测试应用程序。因为我没有得到测试应用程序没有删除的对象的内存泄漏,所以我也没有得到这些应用程序对象中组成的对象的内存泄漏,等等。当问题可以用十几行来证明时,我真的不明白提交数百行代码行的意义。

标签: c++ xcode memory-leaks instruments xcode4.5


【解决方案1】:

您可以查看 Mac 开发人员库中的 Tips for Improving Leak Detection

Cppcheck 用于 C/C++ 代码的静态分析工具也可能会有所帮助。对于您提供的示例,它发现:

#>cppcheck  so_code.cpp
Checking so_code.cpp...
[so_code.cpp:15]: (error) Memory leak: iPerson

【讨论】:

    【解决方案2】:

    Leaks Instrument 以预定义的频率执行快照。默认情况下,该值为“每 10 秒”。您的程序在 10 秒前完成。因此,泄漏永远不会被收集。因此,您必须在 iPerson 超出范围后暂停执行,以便检测到该泄漏。此外,如果您只是添加一个 sleep 而该指针仍然在堆栈或寄存器中被引用,那么它不会是泄漏。

    【讨论】:

      【解决方案3】:

      我已经解决了:

      • 我必须将快照间隔设置为 1 秒。
      • 我不得不为发布版本禁用(设置为无)优化(已完成分析)。

      然后根据贾斯汀的回复和this question,我不得不像这样修改我的代码:

      #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;
      }
      

      仍有一些奇怪的事情发生。例如,如果您开始在 CreateLeaks 中添加 sleep(2),Instruments 不会捕获所有泄漏(取决于您放置 sleep 命令的位置。奇怪。

      【讨论】:

        猜你喜欢
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-24
        • 1970-01-01
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多