我想在应用程序中重载new / delete运算符,以捕获所有内存泄漏。它可以在Linux上正常工作。但是我在Windows上遇到了问题。新/删除重载仅适用于.exe,不适用于来自.dll文件的调用。此外,如果在我的代码中创建了某些对象,但正在从.dll文件中删除该对象,则会导致应用崩溃。 Cpreference here说
我编写了最小的Qt模板应用程序来对此进行测试。在这里mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <cstdio>
#include <cstdlib>
// replacement of a minimal set of functions:
void *operator new(std::size_t sz)
{
void *ptr = std::malloc(sz);
std::printf("global op new called, size = %zu, pointer = 0x%p\n", sz, ptr);
return ptr;
}
void operator delete(void* ptr) noexcept
{
std::printf("global op delete called, pointer = 0x%p\n", ptr);
std::free(ptr);
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
输出:
global op new called, size = 20, pointer = 0x00c4f608
global op new called, size = 24, pointer = 0x00c4f648
global op new called, size = 16, pointer = 0x00b35bf8
global op new called, size = 24, pointer = 0x00c4f6a8
global op new called, size = 24, pointer = 0x00c4f868
global op new called, size = 24, pointer = 0x00c4f988
global op delete called, pointer = 0x00c4f608
已通过Qt 4.8.7 / GCC 4.8.2和Qt 5.5.1 / GCC 4.9.2进行了测试。那么如何在MinGW中全局超载new / delete?
附言:我写了最少的test case来重现该问题。它输出我
$ ./main.exe
global op new called, size = 4, pointer = 0x003e17b8
global op new called, size = 4, pointer = 0x003e3d68
library delete called, pointer = 0x003e17b8
global op delete called, pointer = 0x003e3d68
最佳答案
我在GCC Bugzilla – Bug 77726上找到了答案。
刘浩写道:
关于c++ - MinGW中的全局过载运算符new/delete,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46025819/