【问题标题】:Smartpointers equivalent等效的智能指针
【发布时间】:2017-08-07 15:19:45
【问题描述】:

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

在 External.cpp 中:

class ExampleClass {...};

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

在Another.cpp中我想正确地做这样的事情,如何?:

ExampleClass *ptr2 = function();

【问题讨论】:

  • 看看here。您提供的代码似乎是工厂函数。

标签: c++ oop smart-pointers


【解决方案1】:

实际上有两个,你可以使用 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();

【讨论】:

    【解决方案2】:

    我不会真正推荐它,但您可以返回一个隐式转换为原始指针的对象。它会在短时间内拥有它,如果没有人抢到它,它会删除它。

    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();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多