有没有办法在堆上获取以前分配的内存的大小? 例如:
//pseudo-code
void* p = operator new (sizeof(int) * 3);
unsigned size = getSomeHow(p);
答案 0 :(得分:8)
你无法一直这样做,因为operator new()
可以以任何合理的方式重载,甚至可以不使用运行时堆。
如果在{C}中使用operator new()
实现malloc()
,您可以使用_msize()
。
答案 1 :(得分:5)
虽然Sharptooth在他的回答中是正确的(新的可以超载),但解决方案可能只是在这个事实。通过重载新的,您可以轻松添加自己的新实现和删除。在您的新实施中,您应该:
删除操作符应该相反:
如果你这样做,请确保实现所有新的和删除(抛出和非抛出,新的和新的[],删除和删除[],...)。
另外要小心第三方库。他们有时会在他们的DLL编译代码中调用new,但是在头文件中调用delete。这意味着new和delete将使用不同的实现,您的应用程序将崩溃。
修改强>
需要舍入到8个字节的倍数并添加8个字节,因为数据应存储在其大小的倍数的地址中:
由于双精度是我所知道的最大的本机数据类型,我们将其舍入为8个字节的倍数,并添加8个字节以确保保持这些要求。
答案 2 :(得分:1)
new
运算符以调用malloc()
并将大小存储在全局std::map<void*, size> alloc
中。 然后这个getSomeHow()
函数的行为就像你想要的那样:
getSomeHow(void *p){
return alloc[p];
}