C++制作和销毁unique_ptr指针

Aug*_*ust 1 c++ pointers

我正在学习使用指针的方法std::unique_ptr.我的代码:

#include <iostream>
#include <memory>

class object{
public:
    void say(){
            std::cout<<"hi";
    }
};

int main(){
      std::unique_ptr<object> p = 
                  std::unique_ptr<object>(new object);
      p->say();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 我使用std::unique_ptr得当吗?

  2. 如何删除或删除this(p)指针,以便没有内存使用或泄漏?

Tar*_*ama 7

std::unique_ptr<object> p = std::unique_ptr<object>(new object);
Run Code Online (Sandbox Code Playgroud)

这很好,但你可以像这样简化:

std::unique_ptr<object> p { new object{} };
Run Code Online (Sandbox Code Playgroud)

或者在C++ 14中这样:

auto p = std::make_unique<object>();
Run Code Online (Sandbox Code Playgroud)

你不需要deletea std::unique_ptr,这就是重点.当p超出范围(在结尾main)时,指针对象将delete自动进行.

也就是说,在这个例子中没有必要使用动态分配.您应该只使用自动变量:

int main(){
      object p{};
      p.say();
}
Run Code Online (Sandbox Code Playgroud)

一个好的经验法则是在必要时使用自动存储持续时间和动态存储持续时间.


std::make_unique 在以下情况下具有防止泄漏的优点:

process(std::unique_ptr<object>(new object), iMightThrow());
Run Code Online (Sandbox Code Playgroud)

如果new object先执行,然后iMightThrow运行并抛出,则内存将被泄露.std::make_unique防止这种情况:

process(std::make_unique<object>(), iMightThrow());
Run Code Online (Sandbox Code Playgroud)

现在,如果iMightThrow()抛出,std::unique_ptr将不会创建遗嘱,或者它将被销毁并回收内存.