[問題] 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