开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++ (C++11)
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
Qt 5.6
问题(Question):
为了查一个内存问题, 尝试 override new/delete 并记录 new/delete 的配对
结果在使用 Qt 的某些 function 时会出现 delete 被传入未经过我 new operator
配置的内存.
我的问题是, override new/delete 应该要直接 hide 原本的 new/delete 才对, 但
是为什么会产生这种情况呢? 跟使用了 Qt library 这类 3rd party library 有关吗?
Qt 内部理论上应该全部使用的是 placement new/delete, 实际上 trigger assert 的
也是其回传 std::string 的 destructor
Override 的内容大略如下:
overridenew.cpp ==================================
static MyMap<void*, size_t> gMemMap;
void *operator new(size_t Size) {
void *p = malloc(Size);
if (p == 0) throw std::bad_alloc();
gMemMap[p] = Size;
return p;
}
void operator delete(void *p) {
if (p == 0) return;
assert(gMemMap.contains(p));
free(p);
}
main.cpp ========================================
int main() {
QString FileName("D:/testerfile_debug/test.log");
QByteArray Array = FileName.toUtf8();
// 下面这行可以正常执行
printf("%s", std::string(Array.constData(), Array.length()).c_str());
// 下面这行会在 std::string 解构时发生 assertion failed
printf("%s", Array.toStdString().c_str());
return 0;
}
我有想过几个原因, 虽然 QByteArray::toStdString() 是一个 inline function
但是否有机会因为 build Qt 时使用的环境与实际使用的 VC++ 不同而产生呼叫到
不同 new/delete 的情况? (不过 Qt 是自己 build 的理论上应该是一样的环境啦...)
或者有其它可能的原因, 不知道各位先进有没有什么想法呢?
P.S. 我后来使用 Windows 的 CRT Debug Heap 相关工具指出, 传进来的 p 确定是
有 allocated 的, 只是它没经过我的 new...