29、make_shared
std::make_shared
是一种用于创建 std::shared_ptr
的推荐方法。
它不仅简洁,而且通常更高效。以下是两种不同的用法及其区别:
-
auto pointer = std::make_shared<int>(10);
- 这行代码创建了一个
std::shared_ptr<int>
,并初始化为值为10
的整数。 std::make_shared
会在单个内存分配中同时分配控制块和对象,效率更高。
- 这行代码创建了一个
-
auto pointer = std::make_shared<int>(new int(1));
- 这行代码实际上是错误的,因为
std::make_shared
不接受指针作为参数。 - 正确的用法应该是
auto pointer = std::shared_ptr<int>(new int(1));
,这会创建一个std::shared_ptr<int>
,指向一个值为1
的整数。 - 这种方法需要两次内存分配:一次用于对象,一次用于控制块,效率较低。
- 这行代码实际上是错误的,因为
总结:
std::make_shared<int>(10)
是推荐的用法,效率更高,代码更简洁。std::shared_ptr<int>(new int(1))
需要手动管理内存分配,容易出错,效率较低。
示例代码:
#include <iostream>
#include <memory>int main() {// 推荐的用法auto pointer1 = std::make_shared<int>(10);std::cout << "pointer1: " << *pointer1 << std::endl;// 不推荐的用法auto pointer2 = std::shared_ptr<int>(new int(1));std::cout << "pointer2: " << *pointer2 << std::endl;return 0;
}
输出:
pointer1: 10
pointer2: 1