楼主:
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