现代c ++中的独特指针

时间:2016-02-04 18:35:39

标签: c++ pointers

我在整个网络上搜索了很多,并且在现代c ++中发现了许多不同的unique_ptr实现示例。我已经开始将所有以::iterators开头的代码更新到auto等等。但是,使用智能指针我不认为我完全理解我想要做的事情。

使用标准指针我有:

 object *temp = new object();

然后使用新的智能指针:

  unquie_ptr<object> temp(new object());

这不是正确的实施方式吗?如果是这样的话,当我在程序结束时构建一个简单的清理函数时,似乎更多的输入/工作来制作智能指针?

3 个答案:

答案 0 :(得分:7)

您可以使用效率更高的std::make_uniquestd::make_shared

但是,make_unique在C ++ 11中不可用,但在C ++ 14及更高版本中

所以

std::unique_ptr<object> = std::make_unique<object>();

auto p = std::make_unique<object>();

shared_ptr类似的事情。

在C ++ 11中,您可以将表达式用于unique_ptr

unquie_ptr<object> temp(new object());

答案 1 :(得分:4)

您应该使用make_unique而不是直接调用构造函数来完全删除new&amp; delete

auto p = std::make_unique<object>();
  

如果是这样的话,那么在我制作智能指针时似乎更多的打字/工作   我的程序结束时有一个简单的清理功能吗?

随着您的计划变得越来越大,您忘记delete使用new创建的内容的可能性会越来越大,这就是unique_ptr可以帮助您的原因。请记住,编写更少的代码并不意味着代码更好。

答案 2 :(得分:3)

智能指针是RAII(资源分配是初始化)容器,它保证在对象超出范围时释放所包含的资源。考虑具有多个退出点的函数或在函数内部某处抛出异常的情况。如果通过显式调用专用函数执行清理,则必须在每个出口点仔细调用该函数。此外,为了确保在抛出异常时资源不会泄漏,还必须在异常处理程序中调用该清理函数(更不用说需要显式处理异常)。使用智能指针,如果调用异常,资源将不会泄漏,因为当堆栈展开并且对象超出范围时,它们将自动处理。

智能指针创建一个干净的抽象,将凌乱的资源管理隔离到较低的水平,并确保资源不会无意中泄露。

与保证使用原始指针类似地管理资源所需的附加代码相比,初始化语法开销是最小的。

智能指针使C ++代码更安全,更小,更易于维护。