c ++ new运算符通过libstdc ++占用大量内存(67MB)

Seb*_*ner 6 c++ malloc gdb new-operator libstdc++

我和new运营商有一些问题libstdc++.我用C++编写了一个程序,并且在内存管理方面遇到了一些问题.

用gdb调试后确定吃了什么东西我得到了以下内容 info proc mappings

Mapped address spaces:

      Start Addr           End Addr       Size     Offset objfile
        0x400000           0x404000     0x4000          0                             /home/sebastian/Developement/powerserverplus-svn/psp-job-distributor/Release/psp-job-distributor
        0x604000           0x605000     0x1000     0x4000                             /home/sebastian/Developement/powerserverplus-svn/psp-job-distributor/Release/psp-job-distributor
        0x605000           0x626000    0x21000          0                                   [heap]
  0x7ffff0000000     0x7ffff0021000    0x21000          0        
  0x7ffff0021000     0x7ffff4000000  0x3fdf000          0       
  0x7ffff6c7f000     0x7ffff6c80000     0x1000          0        
  0x7ffff6c80000     0x7ffff6c83000     0x3000          0        
  0x7ffff6c83000     0x7ffff6c84000     0x1000          0        
  0x7ffff6c84000     0x7ffff6c87000     0x3000          0        
  0x7ffff6c87000     0x7ffff6c88000     0x1000          0        
  0x7ffff6c88000     0x7ffff6c8b000     0x3000          0        
  0x7ffff6c8b000     0x7ffff6c8c000     0x1000          0        
  0x7ffff6c8c000     0x7ffff6c8f000     0x3000          0        
  0x7ffff6c8f000     0x7ffff6e0f000   0x180000          0                     /lib/x86_64-linux-gnu/libc-2.13.so
  0x7ffff6e0f000     0x7ffff700f000   0x200000   0x180000                     /lib/x86_64-linux-gnu/libc-2.13.so
  0x7ffff700f000     0x7ffff7013000     0x4000   0x180000                     /lib/x86_64-linux-gnu/libc-2.13.so
  0x7ffff7013000     0x7ffff7014000     0x1000   0x184000                     /lib/x86_64-linux-gnu/libc-2.13.so
Run Code Online (Sandbox Code Playgroud)

那只是从它身上掏出来的.但是,一切都很正常.其中一些属于标准库的代码,有些是堆,有些是我创建的线程的堆栈部分.

但.有这一节我不知道为什么分配:

  0x7ffff0000000     0x7ffff0021000    0x21000          0        
  0x7ffff0021000     0x7ffff4000000  0x3fdf000          0 
Run Code Online (Sandbox Code Playgroud)

这两个部分是在似乎随机的时间创建的.有几个小时的调试没有时间相似性,也没有某个创建的线程左右.我设置了硬件观察点awatch *0x7ffff0000000run再次给它几个.

这两个部分几乎同时在不可调试函数的相同代码部分中创建(gdb在堆栈中显示它in ?? () from /lib/x86_64-linux-gnu/libc.so.6).更确切地说,这是它发生的样本堆栈:

#0  0x00007ffff6d091d5 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff6d0b2bd in calloc () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00007ffff7dee28f in _dl_allocate_tls () from /lib64/ld-linux-x86-64.so.2
#3  0x00007ffff77c0484 in pthread_create@@GLIBC_2.2.5 () from /lib/x86_64-linux-gnu/libpthread.so.0
#4  0x00007ffff79d670e in Thread::start (this=0x6077c0) at ../src/Thread.cpp:42
#5  0x000000000040193d in MultiThreadedServer<JobDistributionServer_Thread>::Main (this=0x7fffffffe170) at /home/sebastian/Developement/powerserverplus-svn/mtserversock/src/MultiThreadedServer.hpp:55
#6  0x0000000000401601 in main (argc=1, argv=0x7fffffffe298) at ../src/main.cpp:29
Run Code Online (Sandbox Code Playgroud)

另一个例子是(来自差异运行):

#0  0x00007ffff6d091d5 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff6d0bc2d in malloc () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00007ffff751607d in operator new(unsigned long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x000000000040191b in MultiThreadedServer<JobDistributionServer_Thread>::Main (this=0x7fffffffe170) at /home/sebastian/Developement/powerserverplus-svn/mtserversock/src/MultiThreadedServer.hpp:53
#4  0x0000000000401601 in main (argc=1, argv=0x7fffffffe298) at ../src/main.cpp:29
Run Code Online (Sandbox Code Playgroud)

整个事情说它发生在calloc来自pthread lib 的调用中,或者在另一种情况下它是从它调用new operatormalloc调用它.无论new它是什么 - 在几次运行中它几乎new在我的代码中创建或创建了线程.它唯一的"常量"是它每次出现在它身上libc.so.6.

无论代码的哪一点,
无论是与malloc还是calloc一起使用,
无论程序运行了多少时间,
无论创建了多少线程,
都始终是该部分:0x7ffff0000000 - 0x7ffff4000000.

每次程序运行.但每次都在程序的另一个点上.我真的很困惑,因为它分配了67MB的虚拟空间,但它没有使用它.当看着它在这里创建的变量,尤其是看着那些在创建时malloccalloc通过libc中被称为,没有这个空间的使用它们.它们是在远离该地址范围的堆部分中创建的(0x7ffff0000000 - 0x7ffff4000000).


编辑:

我也检查了父进程的堆栈大小,得到了8388608字节的使用,即0x800000(~8MB).为了获得这些价值,我做了:

pthread_attr_t attr;
size_t stacksize;
struct rlimit rlim;

pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
getrlimit(RLIMIT_STACK, &rlim);
fit into a size_t variable. */
printf("Resource limit: %zd\n", (size_t) rlim.rlim_cur);
printf("Stacksize: %zd\n", stacksize);
pthread_attr_destroy(&attr);
Run Code Online (Sandbox Code Playgroud)

请帮帮我.我真的很困惑.

Mar*_*ork 4

看起来它正在为线程分配堆栈空间。
当您在线程中进行函数调用时,将使用该空间。

但实际上正在做什么与你无关。它是内部实现的一部分,pthread_create()它可以在那里做任何它喜欢做的事情。