c++ - 对象的共享所有权是糟糕设计的标志吗?

标签 c++ garbage-collection raii

背景:阅读时Dr. Stroustrup's papers和常见问题解答,我注意到一些来自传奇 CS 科学家和程序员的强烈“意见”和很好的建议。其中之一是关于 C++0x 中的 shared_ptr。他开始解释 shared_ptr 以及它如何表示指向对象的共享所有权。在最后一行,he says and I quote :

. A shared_ptr represents shared ownership but shared ownership isn't my ideal: It is better if an object has a definite owner and a definite, predictable lifespan.

我的问题:RAII 在多大程度上替代了垃圾收集等其他设计模式?我假设手动内存管理不用于表示系统中的共享所有权。

最佳答案

To what extent does RAII substitute other design patterns like Garbage Collection? I am assuming that manual memory management is not used to represent shared ownership in the system

嗯,有了 GC,您真的不必考虑所有权。只要任何人 需要它,该对象就会一直存在。共享所有权是默认且唯一的选择。

当然,一切都可以通过共享所有权来完成。但它有时会导致非常笨拙的代码,因为您无法控制或限制对象的生命周期。您必须使用 C# 的 using block ,或 try/finally 并在 finally 子句中调用 close/dispose 以确保对象得到清理当它超出范围时。

在这些情况下,RAII 更适合:当对象超出范围时,所有清理工作都应该自动进行。

RAII在很大程度上取代了GC。 99% 的时间,共享所有权并不是您真正想要的理想状态。这是一个可以接受的妥协,作为交换,通过获得垃圾收集器来避免很多麻烦,但它并不真正符合您想要的要求。您希望资源在某个时刻消亡。之前没有,之后也没有。当 RAII 是一个选项时,它会在这些情况下产生更优雅、简洁和健壮的代码。

RAII 并不完美。主要是因为它不能很好地处理您只是不知道对象生命周期的偶然情况。只要有人使用它,它就必须保留很长时间。但是您不想永远保留它(或者只要围绕所有客户端的范围,这可能只是主要功能的全部)。

在这些情况下,C++ 用户必须“降级”到共享所有权语义,通常通过 shared_ptr 的引用计数来实现。在这种情况下,GC 胜出。它可以更稳健地实现共享所有权(例如,能够处理周期)和更有效(与体面的 GC 相比,引用计数的摊销成本巨大)

理想情况下,我希望以一种语言看到两者。大多数时候,我想要 RAII,但偶尔,我有一种资源,我只想抛向空中,而不用担心它会在何时何地落地,只相信它会在它落地时被清理干净这样做是安全的。

关于c++ - 对象的共享所有权是糟糕设计的标志吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1960369/

相关文章:

c++ - 如何在函数内部创建一个数组,然后使用该数组创建另一个数组?

C++ 隐式数字类型降级

c++ - 如何通过添加空格或其他字符来读取用户输入?

Lua 5.1 相当于 lua_setgcthreshold

java - 如何在 Java 中固定字节数组?

javascript - 为 node.js 编写 C++ 模块

java - 如何获取 Java 9 打印有关 GC 的 Java 8 样式信息

c++ - C++中同时使用RAII代码和非RAII代码的问题如何解决?

c++ - 什么时候适合使用 C++ 异常?

c++ - 如何理解 pthread_cancel 原因 "terminate called without an active exception"?