将智能指针作为参数传递给类:scoped_ptr或shared_ptr?

Edi*_*enz 5 c++ boost class smart-pointers

我有一个类在一个公共方法中创建一个对象.该对象是私有的,对于该类的用户不可见.然后,此方法调用同一个类中的其他私有方法,并将创建的对象作为参数传递:

class Foo {
   ...
};

class A {
   private:
      typedef scoped_ptr<Foo> FooPtr;

      void privateMethod1(FooPtr fooObj);

   public:
      void showSomethingOnTheScreen() {
          FooPtr fooObj(new Foo);
          privateMethod1(fooObj);
      };
};
Run Code Online (Sandbox Code Playgroud)

我相信在这种情况下正确的智能指针将是一个scoped_ptr,但是,我不能这样做因为scoped_ptr使该类不可复制,如果以这种方式使用,所以我应该这样做的方法:

void privateMethod1(FooPtr& fooObj);
Run Code Online (Sandbox Code Playgroud)

privateMethod1不存储对象,也不保留对它的引用.只需从类Foo中检索数据.

正确的方法可能是根本不使用智能指针并在堆栈中分配对象,但这是不可能的,因为它使用的库不允许堆栈上的对象,它们必须位于堆上.

毕竟,我仍然对scoped_ptr的实际用法感到困惑.

Myk*_*yev 1

此处使用简单的 std::auto_ptr 因为您无法在堆栈上创建对象。最好你的私有函数只接受原始指针。

真正的用法是,您不必捕获所有可能的异常并进行手动删除。

事实上,如果你的对象不修改对象并且你的 API 返回对象,那么你最好使用

void privateMethod1(const Foo& fooObj);
Run Code Online (Sandbox Code Playgroud)

并将对象传递到那里

privateMethod1(*fooObj.get());
Run Code Online (Sandbox Code Playgroud)