std::make_shared和new
时间: 2023-11-16 22:18:15 浏览: 41
std::make_shared和new都是用于动态分配内存的方法,但它们有一些不同之处。
1. 使用方式:
- 使用new时,你需要手动管理内存的生命周期。需要在不再使用对象时使用delete来释放内存。
- 使用std::make_shared时,返回一个std::shared_ptr对象,它会自动管理内存的生命周期。当没有引用指向该对象时,内存会被自动释放。
2. 内存分配方式:
- new直接分配所需的内存空间,并返回一个指向该内存的指针。
- std::make_shared分配一个更大的内存块,用于存储对象及其控制块信息(引用计数等)。返回一个指向该内存块的std::shared_ptr。
3. 性能:
- std::make_shared通常比new具有更好的性能,因为它只需要一次内存分配,并且可以在该内存上共享控制块。
- new在每次对象创建时都需要进行内存分配。
综上所述,如果你需要动态分配一个对象,并且希望自动管理其生命周期,则推荐使用std::make_shared。如果你需要更精细地控制内存的生命周期或者需要在不同的地方共享指针,则可以使用new。
相关问题
std::make_shared源码
```cpp
template<class T, class... Args>
shared_ptr<T> make_shared(Args&&... args)
{
return shared_ptr<T>(new T(std::forward<Args>(args)...));
}
```
`std::make_shared`是一个模板函数,用于创建一个指定类型的`std::shared_ptr`对象。它接受任意数量的参数,并使用这些参数来构造指定类型的对象。在内部,`std::make_shared`通过调用`new`运算符来分配内存,并使用传递的参数来构造对象。然后,它将返回一个指向该对象的`std::shared_ptr`。
使用`std::make_shared`的好处是它可以在一次内存分配中同时分配对象和控制块(用于跟踪引用计数等信息)。这样可以提高性能并减少内存碎片。此外,`std::make_shared`还可以确保异常安全,因为它在内存分配和对象构造之间没有中间状态。
std::make_shared参数
std::make_shared 是 C++11 中的一个函数模板,用于创建共享指针(shared pointer)。它接受可变数量的参数,并使用这些参数来构造一个指定类型的对象,并返回一个指向该对象的共享指针。
std::make_shared 的参数是被构造对象的类型和构造参数。例如:
```cpp
std::shared_ptr<int> ptr = std::make_shared<int>(42);
```
上面的代码中,我们使用 std::make_shared 创建了一个指向整数的共享指针,构造参数是整数值 42。在这种情况下,std::make_shared 通过构造函数创建一个 int 类型的对象,并返回指向该对象的共享指针。
需要注意的是,std::make_shared 会动态分配内存以存储对象,并返回一个指向该内存的共享指针。这意味着我们不需要显式地使用 new 运算符来分配内存。此外,使用 std::make_shared 创建的共享指针是更安全的,可以避免资源泄漏和空悬指针等问题。