【问题标题】:How can I have Xcode Instruments report un-allocated memory as leaked?如何让 Xcode Instruments 将未分配的内存报告为泄漏?
【发布时间】:2014-04-16 16:51:40
【问题描述】:

我正在尝试使用 Xcode 工具 (5.0.1) 查找 C++ 项目的内存泄漏。考虑一下:

#include <iostream>
#include <chrono>
#include <thread>

class Person
{
public:
  int _age;
};

int main(int argc, const char * argv[])
{
  Person* pers1 = new Person();
  pers1->_age = 25;
  std::cout << "Pers1 age is " << pers1->_age << std::endl;
  std::this_thread::sleep_for(std::chrono::milliseconds(5000));
  return 0;
}

我不希望“泄漏”工具报告任何泄漏,因为

Leaks [...] 不知道您将如何处理您的指针。它所知道的是,每个分配的内存块仍然在某处引用。

正如 Zneak 指出的 in his answer to a similar question。 *

但是,我很惊讶 Allocations 没有暗示 Person 对象被分配,随后泄露。

我必须做什么(_pers1 = NULL; 除外)才能让 Instruments 报告该程序正在泄漏?或者这里根本没有泄漏,我对 C++ 的内存分配模型有误解?不是每个new 操作员调用都必须与delete 调用匹配吗?


*) 在同一个答案中,声称

要发生泄漏,您必须丢失分配内存的引用。

对于没有被分配所述内存的程序释放的堆内存,我没有比“泄漏”更好的词了。所以从技术上讲,我所问的可能不是“泄漏”,但我认为很清楚我在考虑什么现象。

【问题讨论】:

    标签: c++ xcode memory-management memory-leaks


    【解决方案1】:

    您的pers1 变量在主函数结束之前仍在作用域内,因此内存永远不会被报告为泄漏。一旦内存泄漏,程序就会终止。

    如果你想造成内存泄漏,你可以将 main 主体的前三行放在另一个函数中,然后在调用 sleep 之前从 main 调用该函数。它应该能够报告内存泄漏,因为程序仍在运行,但pers1 变量将不再在范围内。

    【讨论】:

    • 谢谢加文!所以要明确一点:当程序终止时,操作系统将回收我的程序分配的所有内存?
    • 你是对的。我知道的每一个操作系统都会发生这种情况。
    • @conciliator 是的,这是正确的,所以没有必要在程序终止之前释放一些东西,因为程序的终止将首先回收应用程序正在使用的所有内存。否则每次程序崩溃时,我们都会有可怕的内存泄漏。
    • 谢谢大家!我猜它可能是这样的,但不确定。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-10-10
    • 2012-05-30
    • 2011-04-01
    • 2011-07-21
    • 2012-09-02
    • 2023-04-10
    • 2017-05-26
    • 2016-01-10
    相关资源
    最近更新 更多