非托管C++垃圾回收帮助
我是一名.NET程序员,对于非托管代码没有太多经验。我一直在对非托管项目添加修改和添加,并且一切正常。你能给我一些关于垃圾收集时需要关注哪些代码/对象的指针吗?非托管C++垃圾回收帮助
TIA
无。 C++没有垃圾收集器。
+1绝对如此。 – karlphillip 2010-08-27 16:22:50
对不起,如果我不清楚。我知道C++没有自己的垃圾收集,这需要程序员自己处理。因为我从来没有使用没有gc的语言,所以我正在寻找关于什么以及什么时候处理对象的指导,我不应该遇到任何麻烦。 – user228058 2010-08-27 16:23:43
但是,通过使用不同的内存分配程序,可以添加一个* can *。 Boehm-GC就是这样一个例子。 – greyfade 2010-08-27 16:24:37
在C++中,当您使用new
运算符手动分配内存时,它的工作是使用delete
运算符稍后(不再需要时)释放此内存。
您为此COM添加了标签。如果是这样,您负责调用AddRef()和Release()以适合您使用的任何COM对象。它们控制COM中的引用计数功能,并且与.NET垃圾收集器无关。
对于你的非托管对象,当你完成它们时,你负责调用delete。
karlphillip给你很好的建议。
此外我想补充一点,当你使用对象的时候,删除它们的最好的地方就是类的析构函数。
你一定要小心,因为当你删除了两次,你的程序将炸毁。
有一个有用的技巧来检测对象是否被删除。
删除它们之后,你可以设置指针
delete foo;
foo=null;
下一次你可以检查它是否等于空,另有删除空。最好的事情......即使你会尝试删除空指针,什么都不会发生! :)
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 &阵列 - 的使用取决于如果使用新的或新的[],使得它可以调用正确的删除或删除[]
找出代码是否使用智能指针(它可能是),智能指针应该在超出范围时自己销毁对象。
你要求的是不可能在一个计算器的回复答复 - 至少要很长的时间才能完整和正确,不会让你绊倒。阅读一些很好的C++书。 – peterchen 2010-08-28 00:00:22