作者:
su27 (su27)
2022-03-29 15:45:53開發平台(Platform): (Ex: Win10, Linux, ...)
Win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC++
問題(Question):
請問如果我寫的是
vector<vector<Point2f>> *gb_vvtp ;
gb_vvtp = new vector<vector<Point2f>>();
使用完後我要如何delete "gb_vvtp"
我試了delete | delete[] 都會報錯
作者:
LPH66 (-6.2598534e+18f)
2022-03-29 16:04:00報了什麼錯? 什麼時候報的錯?你的 new 跟 delete 是怎麼寫的? 有相關的程式碼片段嗎?你有沒有把這個指標傳去別的地方或是從別的地方接來?
作者:
Lipraxde (Lipraxde)
2022-03-29 16:13:00還是你 double free 啦~(・・?))
作者:
notBeing (read and be read)
2022-03-29 16:51:00new完後馬上delete應該不會有error吧
作者:
Dracarys (MayShowGunMore)
2022-03-29 17:38:00@@試試address sanitizer
作者:
LPH66 (-6.2598534e+18f)
2022-03-29 19:12:00OK, 所以是傳 STL 容器進 DLL 的問題一般來說建議最好不要這樣做 (由於模版和記憶體管理等問題)網路上有人建議使執行檔和 DLL 使用相同編譯參數來使生成的程式碼相容, 但這做法在各種意義上有點不切實際那這個問題就只是有地方不相容時可能出現的問題之一而已
作者: hsnuyi (羊咩咩~) 2022-03-29 22:59:00
嗯... 為啥要寫成這樣呢? 有啥好處嗎?
作者: hellophoenix (Rainey) 2022-03-29 23:23:00
vector裡的東西不是有配置記憶體的pointer的話不用delete, 應該只要delete最外面new的那個
看不太懂swap移除的部分但感覺你好像把main裡面分配的空間跟dll裡面的混著用
作者:
F04E (Fujitsu)
2022-03-30 09:19:00為什麼vector要用指標?
作者:
notBeing (read and be read)
2022-03-30 11:57:00避免allocate or free另一個process的記憶體可以避掉很多隱諱的錯誤
作者:
LPH66 (-6.2598534e+18f)
2022-03-30 23:59:00模版生成的程式碼可能會隨著編譯參數不同或編譯器版本不同而生成出不相容的程式碼, 因此一個在 main 裡配置的 vector傳進 DLL 裡用 DLL 的 swap 可能會造成介面不符另外由於 vector 有使用動態記憶體配置, 你這一 swap代表你這個在 main 裡配置的 vector 抓著一個在 DLL 配置的記憶體空間; 由於這些分配的程式也跟編譯參數與環境相關在 DLL 索取卻在 main 釋放這樣的動作也會造成存取問題所以一般來說並不建議讓 STL 容器跨越 DLL 邊界要傳一系列東西進去可以傳以指標表示的 C 陣列要傳一系列東西出來則建議設計介面讓 DLL 告知回傳大小或者增加參數讓使用者表示最多可以接收多少東西
Modern c++就不要再自己new delete 了…
作者:
peter98 (新兵)
2022-04-01 12:35:00請問為什麼要用指標 完全沒搞懂
作者:
wulouise (在線上!=在電腦前)
2022-04-03 13:53:00如果人家要你傳pointer的時候通常是傳&var