make_shared能单次内存分配完成对象和控制块的创建,提升性能与异常安全性,适用于大多数场景,但不支持自定义删除器、placement new及C++11/14中数组的创建,且在weak_ptr长期存活时可能影响内存释放。

make_shared
std::shared_ptr
在C++中,使用
make_shared
shared_ptr
make_shared
MyClass
int
std::string
shared_ptr
#include <memory>
#include <string>
#include <iostream>
class MyClass {
public:
int value;
std::string name;
MyClass(int v, const std::string& n) : value(v), name(n) {
std::cout << "MyClass(" << value << ", " << name << ") constructed." << std::cout;
}
~MyClass() {
std::cout << "MyClass(" << value << ", " << name << ") destructed." << std::cout;
}
void greet() const {
std::cout << "Hello from MyClass " << name << " with value " << value << "!" << std::cout;
}
};
int main() {
// 使用 make_shared 创建 shared_ptr 对象
std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>(10, "Alpha");
ptr1->greet();
// 也可以用于无参构造函数
std::shared_ptr<std::string> str_ptr = std::make_shared<std::string>("Hello Shared World");
std::cout << *str_ptr << std::cout;
// 甚至可以创建复杂对象,例如一个向量的shared_ptr
std::shared_ptr<std::vector<int>> vec_ptr = std::make_shared<std::vector<int>>(5, 100); // 5个100
for (int x : *vec_ptr) {
std::cout << x << " ";
}
std::cout << std::cout;
return 0;
}这段代码清晰地展示了
make_shared
make_shared
make_shared
new
当我初次接触
shared_ptr
std::shared_ptr<T> ptr(new T())
std::make_shared<T>()
立即学习“C++免费学习笔记(深入)”;
直接使用
new
std::shared_ptr<MyClass> ptr(new MyClass(10, "Beta"))
new MyClass(10, "Beta")
MyClass
std::shared_ptr
而
std::make_shared<MyClass>(10, "Gamma")
MyClass
MyClass
这种“单次分配”的优化带来了几个好处:
shared_ptr
从我的经验来看,这种优化在处理大量小对象或性能敏感的场景下尤为重要。它不仅仅是语法糖,更是对底层资源管理的一种精妙优化。
make_shared
这可能是
make_shared
make_shared
new
void process_data(std::shared_ptr<Data> data_ptr, int priority);
void log_error(const std::string& msg); // 假设这个函数可能抛出异常
// 危险的写法
void create_and_process_unsafe() {
process_data(std::shared_ptr<Data>(new Data()), log_error("Creating Data object")); // log_error可能抛出异常
}在
create_and_process_unsafe
new Data()
Data
log_error("Creating Data object")log_error
std::shared_ptr<Data>
new Data()
shared_ptr
这种隐蔽的内存泄漏非常难以调试,因为它依赖于特定的执行顺序和异常条件。
现在,我们看看使用
make_shared
// 安全的写法
void create_and_process_safe() {
process_data(std::make_shared<Data>(), log_error("Creating Data object")); // log_error可能抛出异常
}在这种情况下,
std::make_shared<Data>()
Data
shared_ptr
Data
Data
shared_ptr
log_error
Data
make_shared
make_shared
尽管
make_shared
自定义删除器(Custom Deleters): 如果你需要为
shared_ptr
make_shared
shared_ptr
std::shared_ptr<FILE> file_ptr(fopen("test.txt", "w"), [](FILE* f){
if (f) {
std::cout << "Closing file..." << std::cout;
fclose(f);
}
});这里,
fopen
shared_ptr
Placement New 或预分配内存: 如果你的对象需要在已有的内存块上进行构造(例如,为了与C API交互或进行某些低级内存优化),
make_shared
数组(C++11/14): 在C++11和C++14中,
make_shared
shared_ptr
std::make_shared<int[]>(10)
std::shared_ptr<int[]> arr_ptr(new int[10])
make_shared
std::make_shared<int[]>(10)
std::make_shared<int[10]>()
当weak_ptr
shared_ptr
make_shared
shared_ptr
std::weak_ptr
weak_ptr
shared_ptr
std::shared_ptr<T> ptr(new T())
shared_ptr
weak_ptr
总的来说,对于大多数日常编程任务,
make_shared
shared_ptr
以上就是C++如何使用make_shared创建shared_ptr对象的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号