有没有办法在堆上获得以前分配的内存的大小?
例如:
//pseudo-code
void* p = operator new (sizeof(int) * 3);
unsigned size = getSomeHow(p);
Run Code Online (Sandbox Code Playgroud)
虽然Sharptooth在他的回答中是正确的(新的可以超载),但解决方案可能只是在这个事实.通过重载新的,您可以轻松添加自己的新实现和删除.在您的新实施中,您应该:
删除操作符应该相反:
如果你这样做,请确保实现所有新的和删除(抛出和非抛出,新的和新的[],删除和删除[],...).
还要小心第三方库.他们有时会在他们的DLL编译代码中调用new,但是在头文件中调用delete.这意味着new和delete将使用不同的实现,您的应用程序将崩溃.
编辑:
需要舍入到8个字节的倍数并添加8个字节,因为数据应该存储在其大小的倍数的地址中:
由于双精度是我所知道的最大的本机数据类型,我们舍入到8个字节的倍数,我们添加8个字节以确保保持这些要求.