c++ std::make_shared
时间: 2023-10-24 13:29:52 浏览: 267
`std::make_shared` 是 C++ 标准库中的一个函数模板,用于创建一个共享指针(shared pointer)对象。它接受参数并返回一个指向动态分配的对象的共享指针。
使用 `std::make_shared` 可以方便地创建共享指针,而不需要显式调用 `new` 进行内存分配。该函数模板接受任意数量的参数,并将这些参数传递给对象的构造函数来初始化对象。
以下是 `std::make_shared` 的示例用法:
```cpp
#include <memory>
class MyClass {
public:
MyClass(int value) : m_value(value) {
// 构造函数
}
private:
int m_value;
};
int main() {
// 使用 std::make_shared 创建共享指针
std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>(42);
return 0;
}
```
在上面的示例中,我们使用 `std::make_shared` 创建了一个共享指针 `ptr`,并传递了参数 `42` 给 `MyClass` 的构造函数来初始化对象。这样就可以通过 `ptr` 来访问这个动态分配的对象了。
相关问题
c++std::make_shared用法
std::make_shared 是 C++11 中引入的一个函数模板,用于在动态内存中创建对象并返回一个指向该对象的 shared_ptr 智能指针。
使用 std::make_shared 的语法如下:
```cpp
std::shared_ptr<T> std::make_shared<Args>(Args&&... args);
```
这里的 T 是要创建对象的类型,而 Args 是传递给 T 的构造函数的参数类型。Args&&... args 是可变参数模板,允许你传递任意数量的参数。
使用 std::make_shared 的好处是它可以更高效地分配内存和管理对象的生命周期。它将对象和分配的内存合并在一起,减少了额外的内存分配次数,并且能够正确地处理异常情况。
下面是一个示例,展示了如何使用 std::make_shared 创建一个包含整数值的 shared_ptr 智能指针:
```cpp
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> ptr = std::make_shared<int>(42);
std::cout << *ptr << std::endl; // 输出 42
return 0;
}
```
在这个示例中,我们使用 std::make_shared 创建了一个指向整数值为 42 的 shared_ptr 智能指针。通过解引用该指针,我们可以访问所指向的整数值并进行输出。
希望这个例子能够帮助你理解 std::make_shared 的用法。如果还有其他问题,请随时提问!
boost::make_shared和std::make_shared
boost::make_shared和std::make_shared都是用于创建智能指针的函数模板。它们的作用是在堆上创建一个对象,并返回一个指向该对象的智能指针。
boost::make_shared是Boost库中的函数模板,而std::make_shared是C++标准库中的函数模板。它们的功能和用法基本相同,都可以用来创建shared_ptr和weak_ptr。
使用make_shared函数模板可以避免显式地使用new操作符来创建对象,并且可以确保对象和引用计数的内存分配在一次内存分配中完成,从而提高了性能和内存利用率。
下面是使用boost::make_shared和std::make_shared的示例代码:
```cpp
#include <iostream>
#include <memory>
#include <boost/make_shared.hpp>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor" << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor" << std::endl;
}
};
int main() {
// 使用boost::make_shared创建shared_ptr
boost::shared_ptr<MyClass> ptr1 = boost::make_shared<MyClass>();
// 使用std::make_shared创建shared_ptr
std::shared_ptr<MyClass> ptr2 = std::make_shared<MyClass>();
return 0;
}
```
在上面的示例中,我们分别使用boost::make_shared和std::make_shared创建了一个名为ptr1和ptr2的shared_ptr对象,它们都指向一个MyClass对象。当程序结束时,智能指针会自动释放内存,调用MyClass的析构函数。
需要注意的是,使用make_shared函数模板创建的智能指针对象不能使用delete操作符来释放内存,因为内存的释放是由智能指针自动管理的。
阅读全文