[英]where did the memory go?
class Node
{
//some member variables.
};
std::cout<<"size of the class is "<<sizeof(Node)<<"\n";
int pm1 =peakmemory();
std::cout<<"Peak memory before loop is "<< pm1<<"\n";
for(i=0; i< nNode; ++i)
{
Node * p = new Node;
}
int pm2 =peakmemory();
std::cout<<"Peak memory after loop is "<< pm2<<"\n";
我认为nNode * sizeof(Node)
pm2-pm1
近似于nNode * sizeof(Node)
。 但事实证明pm2-pm1
比nNode *sizeof(Node)
大得多。 记忆去哪儿了? 我怀疑sizeof(Node)
没有反映正确的内存使用情况。
我已经在 Windows 和 linux 上进行了测试。 最终结论是Node * p = new Node;
将分配大于sizeof(Node)
的内存,其中Node
是一个类。
由于您尚未指定正在运行的平台,因此有以下几种可能性:
sizeof(Node)
单位分配内存,例如限制它所做的簿记量。这并不是说这确实发生了。 但它可以; 它当然符合语言规范(AFAICT)。
几乎所有的内存分配器(例如 linux/win32 上的那些)都有一个分配头来进行内存分配(其中包括有关分配大小的信息)。 例如,在 linux 上,您可以查看 malloc 的源代码,其中提供了有关存储的标头(以及如何计算其大小)的信息:
https://git.busybox.net/uClibc/tree/libc/stdlib/malloc/malloc.h#n106
正如评论中已经提到的,调试版本还可以在分配的任一侧分配额外的字节,以防止缓冲区溢出错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.