我尝试为程序重载全局new
和delete
运算符:
标题
void* operator new(std::size_t n);
void* operator new(std::size_t n, const std::nothrow_t&);
void operator delete(void* p);
实施
void* allocMemory(std::size_t n) {
MemoryAllocationRecord** pRecord = static_cast<MemoryAllocationRecord**>(
malloc(n + sizeof(MemoryAllocationRecord*)));
if(pRecord == nullptr) return nullptr;
void* retBlock = static_cast<void*>(pRecord+1);
*pRecord = nullptr;
//may set *pRecord to a legal pointer
return retBlock;
}
void* operator new(std::size_t n) {
void* ret = allocMemory(n);
if(ret == nullptr) throw std::bad_alloc();
return ret;
}
void* operator new(std::size_t n, const std::nothrow_t&) {
return allocMemory(n);
}
void operator delete(void* p) {
if(p == nullptr) return;
MemoryAllocationRecord** pRecord = static_cast<MemoryAllocationRecord**>(p) - 1;
if(*pRecord != nullptr){
//may use *pRecord as a legal pointer
}
return free(pRecord);
}
当我在一个应用程序(使用Qt 5.11库)中使用它时,它可以正常工作。但是在另一个应用程序中,库类型(QList<QVariant>
)的析构函数使用如下所示的内存调用我的重载delete
:
2a 38 02 00 fd fd fd fd*3c 28 5b 00 ...
*
标记传递的指针,所以pRecord == 0xfdfdfdfd0002382a
(然后自然崩溃)。显然,fdfdfdfd
是编译器提供的内存填充,用于检测损坏(我正在运行调试版本),但是我不知道这种情况是如何发生或为什么发生。
如果有任何问题,编译器为MSVC 2017(64位二进制),操作系统为Windows 7,销毁QList<QVariant>
的文件中包含带有操作员重载的标头。