我是一名.net程序员,对非托管代码没有太多经验。我一直在为一个非托管项目添加修改和添加,一切都运行得很好。你能否就我在垃圾收集方面需要关注哪种代码/对象给出一些指示?
TIA
答案 0 :(得分:9)
无。 C ++没有垃圾收集器。
答案 1 :(得分:7)
在C ++上使用new
运算符手动分配内存时,您的工作就是使用delete
运算符稍后释放此内存(不再需要时)。
答案 2 :(得分:3)
如果您拥有堆栈中的所有内容,或者将元素构造到诸如vector之类的容器中,那么您将不必担心内存。
然而,你可能至少使用某种形式的内存分配(new / malloc / createobject / globalalloc / sysstring /...)
MSVC(COM)ATL提供管理“RAII”类型以帮助管理对象的生命周期
CComPtr<>
将管理范围
CComQIPtr<>
也将管理范围,但也会在分配时更改为指定的类型。
C ++有std::auto_ptr<>
,它有点旧,正在推荐弃用
boost / tr1有一堆范围/共享类型用于管理ptr&amp;数组 - 用法取决于你是使用new还是new [],以便它可以调用正确的删除或删除[]
答案 3 :(得分:2)
您已标记此COM。如果是这样,您负责根据您使用的任何COM对象调用AddRef()和Release()。它们控制COM中的引用计数功能,与.NET垃圾收集器无关。
对于非托管对象,您负责在完成删除后调用删除。
答案 4 :(得分:2)
karlphillip给你很好的建议。
此外我想补充一点,当你使用对象时,删除它们的最佳位置是类的析构函数。
你一定要小心,因为当你删除两次时,你的程序会爆炸。
有一个有用的技巧来检测对象是否刚被删除。
删除它们后,可以将指针设置为null
delete foo;
foo=null;
下次你可以检查它是否等于null,否则删除它们。最好的事情......即使你会尝试删除空指针,也不会发生任何事情! :)
答案 5 :(得分:0)
弄清楚代码是否使用智能指针(可能是),智能指针应该在超出范围时自行销毁对象。