gpt4 book ai didi

c++ - g++ -static 导致内存泄漏(mtrace 报告)

转载 作者:太空狗 更新时间:2023-10-29 21:47:53 24 4
gpt4 key购买 nike

所以我遇到了一个奇怪的问题,我希望有人能解释一下......我有以下代码:

#include <unistd.h>
#include <mcheck.h>
#include <pthread.h>

static void *run(void *args)
{
sleep(1);
return NULL;
}

int main()
{
mtrace();
pthread_t thread;
pthread_create(&thread, NULL, run, NULL);
pthread_join(thread, NULL);

return 0;
}

我编译我用这两种方式编译它:

g++ -static program.cpp -lpthread

g++ program.cpp -ltpthread

当我查看 mtrace 的输出时(在我的例子中是 mem.out)

当我使用 -static 选项时,我看到以下内容,mtrace 报告:

Memory Not freed:
__________________
Address Size Caller
0x085ac350 0x88 program.cpp:0

但是当我排除 -static 选项时,mtrace 报告光荣的:

No memory leaks.

关于这里发生的事情有什么想法吗?

最佳答案

这是在我的常规桌面 Linux 系统 (FC-17) 上重现它的方法:

#include <mcheck.h>
#include <pthread.h>

extern "C" { static void *run(void *) { return 0; } }

int main() {
mtrace();
pthread_t thread;
pthread_create(&thread, 0, run, 0);
pthread_join(thread, 0);
return 0;
}

使用 g++ -g -static -pthread 编译。这就是我执行它以获得 mtrace 错误的方式:

$ MALLOC_TRACE=mt.txt mtrace ./a.out mt.txt

Memory not freed:
-----------------
Address Size Caller
0x00000000011a9c90 0x110 at 0x43d7f9

我有一个 64 位系统,所以大小不匹配。当我反汇编 gdb 中的地址时,它给出了这个:

(gdb) disass 0x43d7f9
Dump of assembler code for function _dl_allocate_tls:
0x000000000043d7c0 <+0>: mov %rbx,-0x20(%rsp)
0x000000000043d7c5 <+5>: mov %rbp,-0x18(%rsp)
...
0x000000000043d7f4 <+52>: callq 0x428150 <calloc>
0x000000000043d7f9 <+57>: test %rax,%rax
0x000000000043d7fc <+60>: je 0x43d8e0 <_dl_allocate_tls+288>
...

所以它看起来像是为线程分配了一些线程本地存储。这似乎是每个线程的一次性分配,因为当我在加入后添加一个 pthread_create 调用时没有额外的分配,而当我在加入之前添加它时有一个。 _dl_allocate_tls 表明这通常是在动态链接期间调用的函数,但它似乎是在线程堆栈初始化期间调用的。通过 glibc 代码的 grep 显示它正在 allocate_stack.c 中调用。

glibc 中似乎确实有对_dl_deallocate_tls 的相应调用,所以我认为这个错误是无害的。 valgrind 不会发现任何内存泄漏。

关于c++ - g++ -static 导致内存泄漏(mtrace 报告),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145662/

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