【问题标题】:Can't detect C leaks in xcode 9 instruments无法检测 xcode 9 仪器中的 C 泄漏
【发布时间】:2018-07-09 10:24:00
【问题描述】:

我是第一次尝试使用乐器。因此,我编写了一个小 C 程序来检测仪器中的内存泄漏。

代码:

#include <stdio.h>
#include<stdlib.h>
#include <unistd.h>

int main()
{
    int *temp = NULL;
    temp = (int*)malloc(100*sizeof(int));
    for (int i = 0; i<100; ++i) {
        temp[i] = i;
    }
    printf("%d", *(temp+1));
    printf("Hello   ");
    temp = NULL;
    usleep(10000000);
    printf("%d", *(temp+1));
}


当我使用free(temp)


在第一张图片中,没有泄漏,但在下面的面板中我们可以看到分配的详细信息。

在第二张图片中,没有泄漏,但在下面的面板中我们可以看到没有细节。

这是为什么呢?谁能解释一下输出(上面板和下面板)?

谢谢!


更新:

你的意思是这样的?

int main()
{
    char **temp = NULL;
    temp = (char**)malloc(100*sizeof(char*));
    for (int i = 0; i<100; ++i) {
        temp[i] = (char *)malloc(100*sizeof(char));
        temp[i]=NULL;
        usleep(2000000);
    }
}

P.S 我标记了 C++,因为我认为上面的代码也可以用 C++ 编写。如果我错了,请删除标签。

【问题讨论】:

  • 在第一个示例中,泄漏不算数,因为程序在将指针设置为NULL 后直接退出。通过在循环中分配并在循环中将指针设置为NULL,您可能会获得更好的结果。
  • @JeremyP 我已经更新了答案。这是你说要对我做的吗?
  • 或多或少。可能想要写入每个分配的 RAM。
  • @JeremyP 试图在循环temp[i] = "Hi, Hello" 中分配一个字符串。仍然没有泄漏。
  • @unknownymouse 也许编译器足够聪明,可以避免您的简单程序泄漏。

标签: c xcode macos memory-leaks instruments


【解决方案1】:

您的代码没有问题。如您所料,它会造成内存泄漏。问题(实际上很好)出在 Xcode 上。

Xcode 优化您的代码以消除所有内存泄漏。这就是仪器没有显示任何内存泄漏的原因。

要查看内存泄漏,请禁用 Xcode 中的优化。

选择None [-O0] 禁用所有优化。


您使用仪器来分析最终生产代码。因此,请勿更改 Release 设置。您可能会忘记改回它,您的程序将不会被优化。

改为将Profile 的方案从Release 编辑为Debug。这样做你总能得到Release的优化代码。

1). 点击可执行图标

2)。点击Edit Scheme

3).Build Configuration 更改为Debug

现在,每当您分析您的代码时,您都会收到所有错误,因为您的代码没有经过优化。

要配置您的发布代码,请将其更改回 Release 中的 Build Configuration

【讨论】:

    猜你喜欢
    • 2011-09-27
    • 2011-10-14
    • 2011-08-30
    • 1970-01-01
    • 2023-03-11
    • 2012-05-07
    • 2014-05-01
    • 2020-08-01
    • 1970-01-01
    相关资源
    最近更新 更多