错误的问题
在使用智能指针的 C++ 项目中
这个问题实际上与智能指针无关。这只是关于所有权。
智能指针只是工具
他们没有改变所有权的概念,尤其是。需要在您的程序中明确定义所有权,所有权可以自愿转让,但不能由客户获取。
您必须了解智能指针(也包括锁和其他 RAII 对象)同时表示一个值和 WRT 此值的关系。Ashared_ptr
是一个对象的引用,建立关系:对象不能在 this 之前被销毁shared_ptr
,当 thisshared_ptr
被销毁时,如果是最后一个给这个对象起别名,则必须立即销毁该对象。(unique_ptr
可以被视为一种特殊情况,shared_ptr
根据定义,别名为零,因此unique_ptr
始终是对象的最后一个别名。)
为什么应该使用智能指针
建议使用智能指针,因为它们仅使用变量和函数声明来表达很多内容。
智能指针只能表达定义良好的设计,它们不会消除定义所有权的需要。相反,垃圾收集消除了定义谁负责内存释放的需要。(但不要取消定义谁负责其他资源清理的需要。)
即使在非纯函数式垃圾收集语言中,您也需要明确所有权:如果其他组件仍需要旧值,您不希望覆盖对象的值。在 Java 中尤其如此,其中可变数据结构的所有权概念在线程程序中极为重要。
原始指针呢?
使用原始指针并不意味着没有所有权。它只是没有通过变量声明来描述。它可以在注释、您的设计文档等中进行描述。
这就是为什么许多 C++ 程序员认为使用原始指针而不是适当的智能指针是劣等的:因为它的表达能力较差(我故意避免使用“好”和“坏”这两个术语)。我相信使用一些 C++ 对象来表达关系,Linux 内核会更具可读性。
您可以使用或不使用智能指针来实现特定设计。适当使用智能指针的实现将被许多 C++ 程序员认为是优越的。
你真正的问题
在 C++ 项目中,关于使用“this”的良好设计理念是什么?
这是非常模糊的。
存储原始指针以供以后使用是很危险的。
为什么你需要一个指针供以后使用?
您已经放弃了对对象删除的控制,并相信负责的组件会在正确的时间执行此操作。
实际上,某些组件负责变量的生命周期。你不能承担责任:它必须被转移。
如果我曾经将它存储在另一个变量中或将其传递给另一个可能存储它以供以后使用的函数或将其绑定到回调中,我正在创建当任何人决定使用我的类时引入的错误。
显然,由于调用者没有被告知该函数将隐藏一个指针并在以后不受调用者控制的情况下使用它,因此您正在创建错误。
解决方案显然是:
- 将处理对象生命周期的责任转移给函数
- 确保指针仅在调用者的控制下保存和使用
只有在第一种情况下,您最终可能会在类实现中使用智能指针。
你问题的根源
我认为您的问题是您正在努力使用智能指针使事情复杂化。智能指针是使事情变得更容易而不是更难的工具。如果智能指针使您的规范复杂化,那么请从更简单的角度重新考虑您的规范。
在遇到问题之前,不要尝试引入智能指针作为解决方案。
只引入智能指针来解决特定的定义明确的问题。因为你没有描述一个明确定义的具体问题,所以不可能讨论一个具体的解决方案(涉及或不涉及智能指针)。