開發平台(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...