std::make_unique小结
1. 概念
在 C++ 中,std::make_unique
是一个用于创建std::unique_ptr
(独占所有权的智能指针)的工具函数。
std::make_unique
的主要目的是方便、安全地创建std::unique_ptr
对象,并对动态分配的对象进行管理。它在创建std::unique_ptr
的同时,会在合适的时机自动调用所管理对象的构造函数,确保资源的正确分配和初始化。与直接使用new
操作符和手动构造std::unique_ptr
相比,std::make_unique
提供了更简洁、更安全的方式来管理动态分配的资源,并且能够避免一些潜在的错误,例如资源泄漏和异常安全问题。
2. 使用方法
-
创建单个对象
可以使用
std::make_unique
来创建单个对象,例如:
#include <iostream>#include <memory>class MyClass {public:MyClass() {std::cout << "MyClass constructor called." << std::endl;}~MyClass() {std::cout << "MyClass destructor called." << std::endl;}};int main() {auto ptr = std::make_unique<MyClass>();return 0;}
在这个例子中,std::make_unique<MyClass>()
创建了一个MyClass
类型的对象,并由std::unique_ptr
管理其生命周期。当ptr
超出作用域时,MyClass
的析构函数会被自动调用,确保资源的正确释放。
-
创建数组对象
std::make_unique
也可以用于创建动态分配的数组对象,例如:
#include <iostream>#include <memory>int main() {auto arrPtr = std::make_unique<int[]>(5);for (int i = 0; i < 5; ++i) {arrPtr[i] = i;}return 0;}
在这个例子中,std::make_unique<int[]>(5)
创建了一个包含 5 个整数的动态数组,并由std::unique_ptr
管理其生命周期。当arrPtr
超出作用域时,数组的内存会被自动释放。
-
作为函数参数传递
std::make_unique
创建的std::unique_ptr
可以方便地作为函数参数传递,例如:
#include <iostream>#include <memory>void processObject(std::unique_ptr<MyClass> objPtr) {std::cout << "Processing object." << std::endl;}int main() {auto ptr = std::make_unique<MyClass>();processObject(std::move(ptr));return 0;}
在这个例子中,std::make_unique<MyClass>()
创建的std::unique_ptr
被传递给processObject
函数。通过使用std::move
,将所有权从一个std::unique_ptr
转移到另一个,确保资源的正确管理。
使用std::make_unique
可以提高代码的安全性和可读性,减少资源管理错误的可能性。它是 C++14 引入的一个非常有用的工具函数,特别是在处理动态分配的资源时。