[问题] Override new/delete 与 3rd party library

楼主: Ebergies (火神)   2016-05-26 15:48:40
开发平台(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...
作者: descent (“雄辩是银,沉默是金”)   2016-05-26 16:58:00
void *operator new[](size_t s)这个是不是没写到?
作者: uranusjr (←這人是超級笨蛋)   2016-05-26 18:33:00
你有考虑到 QByteArray::toStdString 根本没用到 new的可能性吗 XD http://d.pr/19jmF会不会是某种神奇的最佳化啊?例如编译器知道 string 没有被修改所以直接 implicit share 省一个 copy, 然后QByteArray 比 string 先被解构, 然后 compiler 把 data留着等到 std::string 解构时才删除, 造成没配对之类的
作者: tinlans ( )   2016-05-27 04:29:00
不怕 LGPL violation 的话,先试试看静态连结 Qt XD
作者: EdisonX (卡卡兽)   2016-05-27 13:04:00
f:\dd\vctools -> https://goo.gl/EJXBXy
作者: uranusjr (←這人是超級笨蛋)   2016-05-27 13:06:00
f:\dd\vctools\... 这个是从 MSVCRT.DLL 来的欸
作者: tinlans ( )   2016-05-27 14:20:00
现在担心的就是 cross-DLL problem,但我没时间详细了解你遇到的这个问题 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com