перегрузка new и delete - перегруженное удаление вызвано из-за неправильной памяти - PullRequest
0 голосов
/ 23 октября 2018

Я пытался перегрузить глобальные операторы 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>.

...