C++ 了解堆上保留内存的大小
有没有办法获取以前在堆上分配的内存大小?C++ 了解堆上保留内存的大小,c++,C++,有没有办法获取以前在堆上分配的内存大小? 例如: //pseudo-code void* p = operator new (sizeof(int) * 3); unsigned size = getSomeHow(p); 您不能总是这样做,因为operator new()可以以任何合理的方式重载,甚至可能不使用运行时堆 > 操作符new()/Cuff>在VisualC++中使用MalCube()/实现,您可以使用.< /P>< P>。尽管Sharptooth的答案是正确的(新的可以重
例如:
//pseudo-code
void* p = operator new (sizeof(int) * 3);
unsigned size = getSomeHow(p);
您不能总是这样做,因为
operator new()
可以以任何合理的方式重载,甚至可能不使用运行时堆
<> > <代码>操作符new()/Cuff>在VisualC++中使用
- 编辑:将大小四舍五入到下一个8字节的倍数
- 向应用程序请求的大小添加8个字节
- 调用系统内存分配例程(例如Windows中的HeapAlloc)
- 在前8个字节中填写最初请求的大小
- 将8添加到返回的指针,并将其返回给应用程序
- 从应用程序给定的指针中减去8个字节
- 调用系统内存释放例程
- 字符可以再存储
- 短裤必须存放在均匀的地址上
- long必须存储在4的倍数的地址上
- double必须存储在8的倍数的地址上
- 您可以重写
操作符来调用new
,并将大小存储在全局malloc()
中李>std::map alloc
getmomeize()
函数的行为将与您想要的一样:
getSomeHow(void *p){
return alloc[p];
}
- 您还可以编写自己的malloc(),并将加载程序设置为使用您的malloc而不是标准的malloc。我这样做是为了追踪,效果很好李>
大小\u t
变量”?因为本机数据类型需要存储在一个地址上,该地址是其大小的倍数。通常,最大的数据类型是double,即8字节。因此,我们需要向大小和指针添加8个字节,以使其保持8字节的倍数。(对我的帖子稍加修改,以确保我们保持8字节的倍数)。好的,我明白了。那么它不应该是max(sizeof(double)、sizeof(void*)
或类似的东西,这样代码就可以移植到1024位(或其他)计算机上吗?你的意思是,以前分配给函数代码、线程控制流还是进程、堆上?