相当于智能指针

Smartpointers equivalent

此代码在 C++ 中有一个带有智能指针的等效编码?

在External.cpp中:

class ExampleClass {...};

ExampleClass* function()
{
  ExampleClass *ptr = new ExampleClass();
  ptr->doSomething();
  return ptr;
}

在Another.cpp我想正确地做这样的事情,怎么做?:

ExampleClass *ptr2 = function();

实际上有两个,你可以使用unique_ptr或shared_ptr,看这里什么时候使用哪个:Which kind of pointer do I use when?

如果你选择 unique_ptr,那么你会得到:

class ExampleClass {...};

std::unique_ptr<ExampleClass> function()
{
  std::unique_ptr<ExampleClass> uptr = std::make_unique<ExampleClass>();
  uptr->doSomething();
  return std::move(uptr);
}

//In Another.cpp 
std::unique_ptr<ExampleClass> ptr2 = function();
//you could even store the result in a shared pointer!!
std::shared_ptr<ExampleClass> ptr3 = function();

我不会真的推荐它,但你可以 return 隐式转换为原始指针的对象。它会暂时拥有它,如果没有人抢它就会删除它。

struct RelinquishOrDelete {
  ExampleClass *_ptr;

  operator ExampleClass*() { auto ret = _ptr; _ptr = nullptr; return ret; }

  ~RelinquishOrDelete() {
    if(!_ptr) { 
      cerr << "returned object wasn't taken by a new owner\n";
      delete _ptr;
    }
  }
};

使用起来很简单。在这种简单的情况下,它将打包和解包指针:

RelinquishOrDelete function()
{
  ExampleClass *ptr = new ExampleClass();
  ptr->doSomething();
  return {ptr};
}

// ...

ExampleClass *ptr2 = function();

但是,当然,如果在这段非常合理的代码中使用它可能会导致意外行为:

auto ptr3 = function();

具有更严格的所有权语义的智能指针确实是最好的方法。