gpt4 book ai didi

c - 无论如何要检查 C 中是否存在内存泄漏?

转载 作者:太空宇宙 更新时间:2023-11-04 02:44:56 25 4
gpt4 key购买 nike

我最近了解了 memalloc() 和 free(),我只是想知道是否有一种方法可以适本地检查是否所有的 memallocs 都被适本地释放了?

我这里有这段代码用于实现双向链表,我不清楚 id 是否需要遍历每个节点并释放每个 p1 和 p2,还是只做一次才算数?:

struct s {
int data;
struct s *p1;
struct s *p2;
};

void freedl(struct s *p)
{
if(p->p1 != NULL)
{
printf("free %d \n", p->p1->data);
}

if(p->p2 != NULL)
{
freedl(p->p2);
}
else
{
printf("free last %d", p->data);
free(p);
}

}

int main(void) {

struct s *one, *two, *three, *four, *five, *six;

one = malloc(sizeof *one);
two = malloc(sizeof *two);
three = malloc(sizeof *three);
four = malloc(sizeof *four);
five = malloc(sizeof *five);
six = malloc(sizeof *six);

one->data = 1;
one->p1 = NULL;
one->p2 = two;

two->data = 2;
two->p1 = one;
two->p2 = three;

three->data = 3;
three->p1 = two;
three->p2 = four;

four->data = 4;
four->p1 = three;
four->p2 = five;

five->data = 5;
five->p1 = four;
five->p2 = six;

six->data = 6;
six->p1 = five;
six->p2 = NULL;

freedl(one);

return EXIT_SUCCESS;
}

我只是想确保我做对了!

最佳答案

答案是"is";具体有多难取决于您使用的操作系统。

如果您使用的是 Linux、Mac OS X 或其中一种 BSD(FreeBSD、OpenBSD 等):

(可能还有俳句)

您可以使用名为 valgrind 的实用程序。它是一个优秀实用程序,专为(除其他事项外)设计——检查内存泄漏。

基本用法很简单:

valgrind ./my-program

虽然它是一个复杂的实用程序,所以我建议查看 valgrind manual以获得更高级的用法。

它实际上做的远不止于此,因为它可以检测到许多(但不是全部)越界访问和类似问题。它还包括其他可能有用的工具,例如用于分析代码的 callgrind

但是请注意,valgrind 会由于其运行方式而使您的程序运行非常缓慢。

任何其他操作系统(包括 Windows):

不幸的是,Windows 没有这样的实用程序(无论如何,没有免费的;商业的要花一大笔钱,最后我检查过 --- 而且没有一个比 valgrind & friend 可以)。

但是,您可以执行宏并在退出时手动检查:

#define malloc(size) chk_malloc(size, __FILE__, __LINE__)
#define free(ptr) chk_free(ptr, __FILE__, __LINE__)
// etc... for realloc, calloc

...

// at start of main():
atexit(chk_report); // report problems when program exits normally

然后您必须实现chk_mallocchk_free 等等。但是,如果您执行诸如 setAllocator(malloc) 之类的操作,则可能会出现一些“泄漏”。如果您不介意丢失线路信息,则可以尝试执行以下操作:

#define malloc chk_malloc // chk_malloc now only takes 1 argument
#define free chk_free
...

即使使用此 #define 也有一些 hack 允许您保留文件/行信息,但它们严重会使事情复杂化(它基本上涉及 hacking 闭包进入 C).

如果您不想以任何方式更改代码,您可以试试运气,只替换那些函数(通过用您自己的 shim DLL 替换 stdlib),尽管您不会得到文件/行信息方式。如果编译是静态完成的,或者如果编译器已将其替换为某些内在函数(这对于 malloc 来说不太可能,但并非不可想象),也可能会出现问题。

实现可以很简单,也可以很复杂,由你决定。我不知道任何现有的实现,但您可以可能在线找到一些东西。

关于c - 无论如何要检查 C 中是否存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28433194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com