除了跨平台,交叉编译器的兼容性,Microsoft Visual C ++(C ++组件扩展)处理对象操作符(^)和C ++ 11 std :: shared_ptr之间有什么显着差异?
两者似乎都通过使用引用计数来支持自动垃圾收集,我认为需要一些额外的内存来跟踪这些信息。这个额外的内存开销是否很重要,并且它们在两个实现之间有很大差异吗?
此外,有没有办法管理何时在MS C ++ Component Extensions或C ++ 11环境中发生垃圾收集,以防止在不希望的时间停止?
MSDN文档: Handle to Object Operator (^) (C++ Component Extensions)
C ++ 11 smart_ptr:std::shared_ptr
答案 0 :(得分:2)
^
不使用引用计数,至少不是单独使用引用计数。
^
处理循环引用。因此,如果A
有^
到B
,B
有^
到A
,其他人都没有^
无论如何,他们将被清理(最终)。
^
也是垃圾的非确定性收集者。关于何时清除无法到达的对象几乎没有保证。
shared_ptr
是一个引用计数智能指针。当使用该引用计数块的每个shared_ptr
达到零时,将执行删除操作。
如果A
shared_ptr<B>
B
,shared_ptr<A>
A
又回shared_ptr
,那么这两个人将永远幸存。< / p>
在程序关闭时,如果删除操作清除进程内存资源,它们将被清除。如果删除操作执行其他操作,则不会调用它(不会手动断开循环)。
^
只是说每个拥有副本的人都拥有与所讨论的东西相同的所有权。当最后一个所有者放弃其权利时,此时将运行删除代码(几乎可以执行任何操作)。
因此,破坏是确定性的(如果确定它何时发生在当地有点棘手)。
对于基于内存的资源,除了内存之外,对象没有任何兴趣,^
样式内存管理并不可怕。但是,一旦你拥有不是内存的资源(“更昂贵”,如文件句柄,网络连接,线程等),你就不能随便让它们闲逛。
因此基于shared_ptr
的生命周期管理不再起作用。
unique_ptr
的生命周期管理确实好一点,但它仍然不太理想,因为追踪有效资源泄漏(理想情况下资源生命周期长于理想情况)仍然是共享所有权的痛苦一生。
^
以其单一责任点,可以更轻松地追踪生命周期问题。
简而言之,shared_ptr
非常棒,因为您拥有几乎无限的资源,并且在清理之前不关心它们是否会泄漏一段时间。当你对共享所有权有严格的理解时,unique_ptr
很棒(你明白谁应该分享所有权,谁应该拥有弱所有权等)。 SELECT total, 'set one' FROM table
UNION ALL
SELECT total2, 'set two' FROM table2
和实际的基于价值的数据最适合您实际拥有的生命周期得到良好控制的资源。
答案 1 :(得分:1)
垃圾收集和引用计数是根本不同的技术。但是,比较C ++ / cli和C ++,最重要的区别是阻止释放/破坏。使用GC,你没有,没有(普通的C ++)(无论你是否使用共享指针)