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

问题描述:

我是一名.NET程序员,对于非托管代码没有太多经验。我一直在对非托管项目添加修改和添加,并且一切正常。你能给我一些关于垃圾收集时需要关注哪些代码/对象的指针吗?非托管C++垃圾回收帮助

TIA

+0

你要求的是不可能在一个计算器的回复答复 - 至少要很长的时间才能完整和正确,不会让你绊倒。阅读一些很好的C++书。 – peterchen 2010-08-28 00:00:22

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

+0

+1绝对如此。 – karlphillip 2010-08-27 16:22:50

+0

对不起,如果我不清楚。我知道C++没有自己的垃圾收集,这需要程序员自己处理。因为我从来没有使用没有gc的语言,所以我正在寻找关于什么以及什么时候处理对象的指导,我不应该遇到任何麻烦。 – user228058 2010-08-27 16:23:43

+0

但是,通过使用不同的内存分配程序,可以添加一个* can *。 Boehm-GC就是这样一个例子。 – greyfade 2010-08-27 16:24:37

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

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

您为此COM添加了标签。如果是这样,您负责调用AddRef()和Release()以适合您使用的任何COM对象。它们控制COM中的引用计数功能,并且与.NET垃圾收集器无关。

对于你的非托管对象,当你完成它们时,你负责调用delete。

karlphillip给你很好的建议。

此外我想补充一点,当你使用对象的时候,删除它们的最好的地方就是类的析构函数。

你一定要小心,因为当你删除了两次,你的程序将炸毁。

有一个有用的技巧来检测对象是否被删除。

删除它们之后,你可以设置指针

delete foo; 
foo=null; 

下一次你可以检查它是否等于空,另有删除空。最好的事情......即使你会尝试删除空指针,什么都不会发生! :)

+0

icky C stylin那里 – 2010-08-27 17:10:45

如果你有堆栈上的所有东西,或者将元素构建到像vector这样的容器中,那么你将不必担心内存。

然而可能至少使用某种形式的内存分配(新/的malloc/CREATEOBJECT /的GlobalAlloc/sysstring/...)的

MSVC(COM)ATL提供管理 'RAII' 类型,以帮助管理对象的使用期限
CComPtr<>将管理范围
CComQIPtr<>也将管理范围,但也将更改为指定的指定类型。

C++有std::auto_ptr<>这是有点老正走向弃用 升压/ TR1具有一堆作用域/共享类型的用于管理的ptr &阵列 - 的使用取决于如果使用新的或新的[],使得它可以调用正确的删除或删除[]

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