非托管C ++垃圾收集帮助

时间:2010-08-27 16:17:53

标签: c++ com garbage-collection unmanaged

我是一名.net程序员,对非托管代码没有太多经验。我一直在为一个非托管项目添加修改和添加,一切都运行得很好。你能否就我在垃圾收集方面需要关注哪种代码/对象给出一些指示?

TIA

6 个答案:

答案 0 :(得分:9)

无。 C ++没有垃圾收集器。

答案 1 :(得分:7)

在C ++上使用new运算符手动分配内存时,您的工作就是使用delete运算符稍后释放此内存(不再需要时)。

What is the difference between new/delete and malloc/free?

答案 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)

弄清楚代码是否使用智能指针(可能是),智能指针应该在超出范围时自行销毁对象。