我在网上搜索了很多,发现了很多现代 C++ 中
unique_ptr
实现的不同示例。我已经开始将从 ::iterators
开始的所有代码更新为 auto
等。但是,使用智能指针,我认为我并不完全理解我应该做什么。
使用标准指针,我有:
object *temp = new object();
然后有了新的智能指针:
unquie_ptr<object> temp(new object());
这不是正确的实现方式吗?如果是这样,当我在程序末尾构建了一个简单的清理函数时,似乎需要更多的打字/工作来制作智能指针?
您可以使用性能更高的
std::make_unique
和 std::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());
您可能应该使用
make_unique
而不是直接调用构造函数来完全删除 new
& delete
:
auto p = std::make_unique<object>();
如果是这样,当我创建智能指针时,似乎需要更多的打字/工作 在我的程序末尾构建了一个简单的清理功能吗?
随着你的程序变得越来越大,你忘记
delete
用new
创建的东西的可能性也会越来越大,这就是为什么unique_ptr
可以帮助你。请记住,编写更少的代码行并不意味着代码更好。
智能指针是一个 RAII(资源分配初始化)容器,它保证当对象超出范围时所包含的资源被释放。考虑一个具有多个退出点的函数或在函数内部的某个点抛出异常的情况。如果通过显式调用专用函数来执行清理,则必须在每个退出点仔细调用该函数。此外,为了确保抛出异常时资源不会泄漏,还必须在异常处理程序中调用清理函数(更不用说需要显式处理异常)。使用智能指针,如果调用异常,资源将不会泄漏,因为当堆栈展开且对象超出范围时,资源将被自动处理。
智能指针创建了一个干净的抽象,将混乱的资源管理隔离到较低级别,并确保资源不会无意中泄漏。
与保证资源通过拥有原始指针进行类似管理所需的额外代码相比,初始化语法开销是最小的。
智能指针使 C++ 代码更安全、更小且更易于维护。
实现示例:
auto object = std::make_unique<Object>();
auto i = std::make_unique<int>(5); // int initialized to 5
auto buffer{ std::make_unique<char[]>(n) }; // char array of size n (variable)
auto object = std::make_shared<Object>();
auto i = std::make_shared<int>(5); // int initialized to 5
auto buffer{ std::make_shared<char[]>(n) }; // char array of size n (variable)