新建和删除超载-调用超载删除会导致错误的内存

时间:2018-10-23 10:11:28

标签: c++ qt new-operator

我尝试为程序重载全局newdelete运算符:
标题

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>的文件中包含带有操作员重载的标头。

0 个答案:

没有答案