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