返回智能指针时的最佳做法

返回智能指针时的最佳做法是什么,例如boost :: shared_ptr? 我应该通过标准的方式返回智能指针还是底层的原始指针? 我来自C#,所以我总是返回智能指针,因为它感觉很好。 像这样(跳过短代码的const正确性):

class X
{
public:
    boost::shared_ptr<Y> getInternal() {return m_internal;}

private:
    boost::shared_ptr<Y> m_internal;
}

不过,我见过一些经验丰富的编码员返回原始指针,并将原始指针放入向量中。 什么是正确的做法?


没有“正确”的方式。 这真的取决于上下文。

您可以使用智能指针在内部处理内存,并在外部提供参考或原始指针。 毕竟,界面用户不需要知道如何在内部管理内存。 在同步的情况下,这是安全和有效的。 在异步环境中,存在许多缺陷。

如果您不确定要做什么,可以安全地将智能指针返回给呼叫者。 当引用计数达到零时,该对象将被释放。 只要确保你没有一个能够永久保存对象的智能指针的类,从而在需要时防止释放。

作为最后一点,在C ++中不要过度使用动态分配的对象。 有很多情况下,你不需要一个指针,可以在引用和常量引用上工作。 这更安全,并减少了内存分配器的压力。


这取决于指针的含义。

当返回一个shared_pointer时,你在语法上说“你将共享这个对象的所有权”,这样,如果原始容器对象在释放指针之前死亡,那么该对象仍然存在。

返回一个原始指针说:“你知道这个对象,但不拥有它”。 这是一种传递控制的方式,但不能保持与原始所有者相关的生命。

(在一些较旧的c程序中,它的意思是“现在是你的问题,删除我”,但我会强烈建议避免这个)

通常情况下,默认共享为我节省了很多麻烦,但这取决于您的设计。


我遵循以下指导原则将指针参数传递给函数并返回指针:

boost::shared_ptr

API和客户端共享此对象的所有权。 但是,如果对象表示某种图形,则必须小心避免带有shared_ptr循环引用。 我试图限制我使用shared_ptr出于这个原因。

boost::weak_ptr / raw pointer

API拥有这个对象,你可以在它有效时共享它。 如果客户有机会比api活得更久,我使用weak_ptr。

std::auto_ptr

API正在创建一个对象,但客户拥有该对象。 这确保返回的代码是异常安全的,并清楚地表明所有权正在转移。

boost::scoped_ptr

用于指向堆栈中存储的对象的指针或作为类成员变量。 我尝试先使用scoped_ptr

像所有的指导方针一样,有些时候规则冲突或者必须弯曲,然后我尝试使用情报。

链接地址: http://www.djcxy.com/p/79937.html

上一篇: best practice when returning smart pointers

下一篇: Print "Hello world" before main() function in C