我对libstdc++
中的new
运算符有一些问题。我用C++编写了一个程序,在内存管理方面遇到了一些问题。
在使用gdb进行调试以确定是什么在吞噬我的ram之后,我得到了以下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
这只是剪下来的。然而,一切都很正常。其中有些属于标准库的代码,有些属于堆,有些属于我创建的线程的堆栈部分。
但是。有一个部分我不知道它被分配的原因:
0x7ffff0000000 0x7ffff0021000 0x21000 0
0x7ffff0021000 0x7ffff4000000 0x3fdf000 0
这两个部分是在一个看似随机的时间创建的。有几个小时的调试,无论是在时间上还是在某个创建的线程上,都没有相似之处。我用awatch *0x7ffff0000000
设置了一个硬件观察点,并再次给它几个run
。
这两个部分几乎同时创建在不可调试函数的同一代码段中(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
另一个例子是这里(来自不同的运行):
#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
整件事表明,它发生在从pthread-lib调用的calloc
,或者在另一种情况下,它是从它调用的new operator
或malloc
。它是哪个new
并不重要——在几次运行中,它几乎发生在我代码中的每个new
或线程创建时。它唯一"不变"的地方是它每次都发生在libc.so.6
中。
无论在代码的哪一点,
不管是否与malloc或calloc一起使用,
无论程序运行了多少时间后,
>无论创建了多少线程后,
始终是该部分:0x7ffff0000000-0x7ff4000000。
每次程序运行时。但每次都是在节目的另一个环节。我真的很困惑,因为它分配了67MB的虚拟空间,但它没有使用它。当观察它在那里创建的变量时,特别是当libc调用malloc
或calloc
时创建的变量,这些空间都没有被它们使用。它们是在远离该地址范围(0x7ffff0000000-0x7ffff 4000000)的堆部分中创建的。
编辑:
我也检查了父进程的堆栈大小,得到了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: %zdn", (size_t) rlim.rlim_cur);
printf("Stacksize: %zdn", stacksize);
pthread_attr_destroy(&attr);
请帮我一下。我真的很困惑。
看起来像是在为线程分配堆栈空间
当您在线程中进行函数调用时,将使用该空间。
但实际上正在做的事情与你无关。它是pthread_create()
内部实现的一部分,它可以在里面做任何它喜欢的事情。