make_shared shared_ptr构造函数
时间: 2023-07-04 21:06:23 浏览: 64
`std::make_shared` 是一个函数模板,用于创建一个 `shared_ptr` 智能指针对象并初始化它所管理的对象。它是 C++11 引入的,并且在 C++14 中进行了优化以提高性能。
`std::make_shared` 接受任意数量的参数,并返回一个指向新创建的对象的 `shared_ptr` 智能指针。它的语法如下:
```cpp
template <typename T, typename... Args>
std::shared_ptr<T> make_shared(Args&&... args);
```
其中,`T` 是要创建的对象的类型,`Args` 是构造函数的参数类型。`args` 是传递给构造函数的实际参数。
使用 `std::make_shared` 可以避免显式的 new 操作符和 delete 操作符,从而避免内存泄漏和悬空指针等问题。此外,使用 `std::make_shared` 还可以提高性能,因为它可以一次性分配内存来存储对象和计数器,从而减少了分配内存和管理计数器的开销。
相关问题
c++make_shared和shared_ptr
C++中的`std::make_shared`和`std::shared_ptr`都是智能指针的一部分,用于管理动态分配的内存。它们提供了一种方便、安全且自动化的方式来管理资源的生命周期。
`std::make_shared`是一个模板函数,用于创建一个指定类型的`std::shared_ptr`对象,并将其与一个新分配的对象关联起来。它接受构造函数的参数,并使用这些参数在堆上分配内存来创建对象。使用`std::make_shared`可以减少内存分配的开销,并且可以更加简洁地创建智能指针。
下面是使用`std::make_shared`创建`std::shared_ptr`的示例:
```cpp
auto ptr = std::make_shared<int>(42);
```
上述代码将创建一个指向整数值为42的`std::shared_ptr`对象。
`std::shared_ptr`是一种智能指针,用于管理共享所有权的对象。它跟踪指向动态分配内存的指针,并在不再需要时自动释放该内存。它使用引用计数来确定内存是否可以被释放。
下面是一个使用`std::shared_ptr`的示例:
```cpp
std::shared_ptr<int> ptr(new int(42));
```
上述代码将创建一个指向整数值为42的`std::shared_ptr`对象。
需要注意的是,当没有任何`std::shared_ptr`指向某个对象时,该对象将被自动删除。这种自动化的内存管理可以避免内存泄漏和悬空指针的问题。
make_unique与make_shared
`make_unique`和`make_shared`都是C++11中引入的模板函数,用于创建动态分配的智能指针对象。它们的区别在于:
`make_unique`用于创建一个`unique_ptr`智能指针对象,该对象独占所指向的对象,不能共享。`make_unique`函数使用起来比直接用`new`操作符分配内存然后传递给`unique_ptr`更加安全,能够避免内存泄漏等问题。
`make_shared`用于创建一个`shared_ptr`智能指针对象,该对象可被多个指针共享。`make_shared`函数会在内存中分配一个控制块,同时在控制块中存储指向所分配对象的指针,以及引用计数等信息。因此,使用`make_shared`函数创建智能指针对象可以减少内存分配次数,提高程序性能。
需要注意的是,`make_shared`需要将所分配的对象直接传递给函数,而不能通过构造函数的方式传递参数。如果需要传递参数,可以使用`std::shared_ptr`的构造函数来创建智能指针对象。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)