PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
C_and_CPP
[問題] 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
繼續閱讀
[問題] winsock 連線 ptt
bjk
[問題] 透過金鑰或自製亂數種子 產生0,1序列的方法
klly193746
[問題] 二元搜索樹加資料的問題
Chieng9086
Re: [問題] 字串減字串?
sj1973
[問題] 如何在.net非console環境叫出console視窗
schizophrena
十三誡增修--10:不要在 stack 設置過大的變數以避免堆疊溢位
wtchen
[問題] socket停止前,執行我要的動作
FierceBreast
十三誡增修--09:慎用Macro(#define)
wtchen
[問題] sizeof 與 語法問題
tomjpsun
[問題] msvc特殊語系字串編譯問題
a2975313
Links
booklink
Contact Us: admin [ a t ] ucptt.com