c++ make_shared
时间: 2023-11-25 10:08:41 浏览: 147
在C++11中引入了智能指针,并且提供了模板函数std::make_shared,可以返回一个指定类型的std::shared_ptr。相比于直接使用std::shared_ptr的构造函数,使用make_shared初始化有以下几个好处。
首先,使用make_shared可以减少内存分配次数。当我们使用std::shared_ptr的构造函数时,首先会为对象分配内存,然后还要为控制块分配内存。而使用make_shared时,内存分配只需要一次,同时对象和控制块都会被放在同一个内存块中,这样可以提高内存使用效率。
其次,使用make_shared可以减少内存泄漏的可能性。当我们使用std::shared_ptr的构造函数时,如果在对象被创建后但尚未分配到std::shared_ptr中之前发生异常,那么可能会导致内存泄漏。而使用make_shared时,对象和控制块是同时分配的,所以不会出现这个问题。
此外,使用make_shared可以提高性能。由于对象和控制块在同一个内存块中,可以减少内存访问次数,从而提高程序的执行速度。
综上所述,使用make_shared来初始化std::shared_ptr可以减少内存分配次数、减少内存泄漏的可能性,并提高程序的性能。所以在C++中,推荐尽量使用make_shared来初始化std::shared_ptr。
相关问题
C++ make_shared
make_shared是C++中的一个函数模板,用于创建一个指向动态分配的对象的std::shared_ptr智能指针。它可以在堆上分配内存并初始化对象。
以下是make_shared函数的语法:
```cpp
std::shared_ptr<T> make_shared<T>(Args&&... args);
```
其中,T是要分配的对象的类型,Args是传递给对象构造函数的参数。
下面是一个示例,演示了如何使用make_shared函数创建一个指向int类型对象的shared_ptr:
```cpp
std::shared_ptr<int> ptr = std::make_shared<int>(42);
```
这将创建一个指向值为42的int对象的shared_ptr。
需要注意的是,make_shared函数可以避免显式地使用new运算符来分配内存,并且可以更高效地管理内存,因为它将对象和控制块(用于跟踪引用计数等信息)一起分配在一块连续的内存中。
C++ make_shared使用
`std::make_shared` 是 C++11 标准库中的一个函数模板,用于在动态内存中创建对象并返回指向该对象的 `std::shared_ptr` 智能指针。使用 `std::make_shared` 的好处是可以避免手动管理内存,同时也可以提高性能。
`std::make_shared` 的语法如下:
```
template<class T, class... Args>
std::shared_ptr<T> make_shared(Args&&... args);
```
其中,`T` 是要创建的对象的类型,`Args...` 是传递给该类型构造函数的参数。返回一个指向 `T` 类型对象的 `std::shared_ptr` 智能指针。
下面是一个使用 `std::make_shared` 的例子:
```c++
#include <memory>
#include <iostream>
class MyClass {
public:
MyClass(int x) : x_(x) {}
void print() { std::cout << "x = " << x_ << std::endl; }
private:
int x_;
};
int main() {
// 创建 MyClass 对象,并返回指向该对象的 shared_ptr
std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>(10);
ptr->print(); // 输出 x = 10
return 0;
}
```
在上面的例子中,我们使用 `std::make_shared` 创建了一个 `MyClass` 对象,并将其返回给 `std::shared_ptr` 智能指针 `ptr`。然后,我们通过 `ptr` 访问了 `MyClass` 对象的 `print()` 方法,输出了 `x = 10`。
阅读全文