std::make_unique是什么意思
时间: 2024-04-13 15:21:13 浏览: 85
std::make_unique是C++14中引入的一个函数模板,用于创建一个动态分配的unique_ptr对象并返回其指针。它的作用类似于new关键字,但是它可以避免内存泄漏和异常安全问题。使用std::make_unique可以使代码更加简洁和易于维护。下面是一个使用std::make_unique创建动态分配对象的例子:
```c++
#include <memory>
#include <iostream>
int main() {
auto ptr = std::make_unique<int>(42);
std::cout << *ptr << std::endl; // 输出:42
return 0;
}
```
在上面的例子中,我们使用std::make_unique创建了一个动态分配的int类型对象,并将其初始化为42。由于使用了std::make_unique,我们不需要手动释放内存,因为unique_ptr会在其生命周期结束时自动释放内存。
相关问题
std::make_unique和std::make_shared
`std::make_unique`和`std::make_shared`都是C++11引入的内存管理工具,用于创建动态对象并返回其指针。
`std::make_unique`用于创建独占所有权的对象,即该对象的所有权只能被一个`std::unique_ptr`持有。它的语法如下:
```
template< class T, class... Args >
std::unique_ptr<T> make_unique( Args&&... args );
```
其中,`T`是要创建的对象类型,`Args`是传递给对象构造函数的参数列表。`make_unique`函数返回一个`std::unique_ptr<T>`对象,该对象拥有对新创建的`T`对象的所有权。
`std::make_shared`用于创建共享所有权的对象,即该对象可以被多个`std::shared_ptr`共享。它的语法如下:
```
template< class T, class... Args >
std::shared_ptr<T> make_shared( Args&&... args );
```
其中,`T`是要创建的对象类型,`Args`是传递给对象构造函数的参数列表。`make_shared`函数返回一个`std::shared_ptr<T>`对象,该对象拥有对新创建的`T`对象的共享所有权。
值得注意的是,`std::make_shared`相较于直接使用`std::shared_ptr<T>`创建对象,具有更好的性能和更少的内存分配次数。因此,在需要共享对象所有权时,应优先使用`std::make_shared`。
c++ std::make_unique
`std::make_unique`是C++11引入的一个库函数模板,它用于动态创建一个新的对象,并返回一个拥有该对象所有权的`std::unique_ptr`。这个函数的主要优点在于简化了内存管理,特别是对于单利模式和复杂对象的创建,它可以确保对象只被构造一次并且在`std::unique_ptr`生命周期结束后会被自动删除,避免了手动进行`new`和`delete`操作带来的潜在问题。
例如,如果你想创建一个复杂的对象,你可以这样做:
```cpp
std::unique_ptr<MyComplexClass> ptr = std::make_unique<MyComplexClass>();
```
这里,`MyComplexClass`替换为你实际需要创建的类名。`ptr`现在拥有对该对象的独占所有权,这意味着不会有其他地方能访问或修改这个对象,直到`ptr`被销毁。
需要注意的是,`std::make_unique`只能用于构造函数没有带默认参数的新式构造函数,以及那些能够接受`nullptr`作为最后一个参数的构造函数。否则,你需要先显式调用默认构造函数再传递给`std::make_unique`。
阅读全文