简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:C++之智能指针分配内存方式总结
2.std::unique_ptr和std::make_unique智能指针介绍
- std::unique_ptr和std::make_unique是C++11引入的两个重要的智能指针,它们的主要目的是自动管理动态分配的内存,防止内存泄漏,并简化资源的生命周期管理。下面是对这两个工具的详细介绍。
std::unique_ptr
std::unique_ptr是一个独占所有权的智能指针。这意味着,同一时间内,只能有一个unique_ptr指向某个对象。
当unique_ptr对象被销毁(例如离开作用域)时,它所指向的对象也会被自动删除。
这种独占所有权的特性使unique_ptr在需要严格管理资源生命周期的场合中特别有用。
- 使用std::unique_ptr的基本语法如下:
std::unique_ptr<int> ptr(new int(42)); // 创建一个指向整数的unique_ptr
// ... 使用ptr
// 当ptr离开作用域时,它所指向的整数会被自动删除
std::unique_ptr还支持自定义删除器,这使得它能够处理非new分配的资源,或者执行额外的清理工作。
std::make_unique
std::make_unique是一个函数模板,它用于创建一个std::unique_ptr实例。这个函数模板的出现,
主要是为了解决使用new直接构造unique_ptr时可能发生的异常安全性问题。
使用make_unique可以确保在对象构造失败时不会发生内存泄漏。
- std::make_unique的基本用法如下:
auto ptr = std::make_unique<int>(42); // 创建一个指向整数的unique_ptr,并初始化为42
// ... 使用ptr
// 当ptr离开作用域时,它所指向的整数会被自动删除
std::make_unique比直接使用new来构造unique_ptr更加简洁,并且更安全。
它会自动调用unique_ptr的构造函数,并且如果在对象构造过程中抛出异常,make_unique会确保不会泄漏内存。
- 综上所述,std::unique_ptr和std::make_unique是C++中用于管理动态分配内存的重要工具。
- 它们不仅提高了代码的安全性,也简化了资源管理的工作,是C++程序员应该熟练掌握的工具。
3.代码实例
<1>.v1.0
struct file {
void* private_data;
};
auto filp = std::make_unique<file>();
使用了 auto 关键字来自动推导 filp 变量的类型。std::make_unique 工厂函数用于创建一个新的 file 对象,并返回一个对应类型的 std::unique_ptr。
由于使用了 auto 关键字,编译器会自动推导出 filp 的类型为 std::unique_ptr。
<2>.v2.0
struct file {
void* private_data;
};
std::unique_ptr<struct file> filp(new file()); // 使用 std::unique_ptr 管理内存
这是最基本的使用方式,直接使用 new 运算符手动创建 file 对象,并将其传递给 std::unique_ptr 构造函数,让 std::unique_ptr 接管这个对象的所有权。
<3>.v3.0
struct file {
void* private_data;
};
std::unique_ptr<struct file> filp(std::make_unique<file>());
这种写法利用了 std::make_unique 工厂函数,它在 C++14 中引入,更为推荐。
std::make_unique 会直接调用 new 运算符来分配内存,并返回一个对应类型的 std::unique_ptr。
该写法与第二种写法效果相同,只是使用了 std::make_unique 来进行内存分配。
<4>.v4.0
struct file {
void* private_data;
};
std::unique_ptr<struct file> filp = std::make_unique<file>();
这是第三种写法的简化版,通过使用 = 进行赋值初始化,使代码更简洁,但实际效果与第三种相同。
<5>.v5.0
struct file {
void* private_data;
};
std::unique_ptr<struct file> filp = std::make_unique<struct file>();
与第四种写法相似,只是在 std::make_unique 的模板参数中指定了 struct file,而不是简单地使用 file。
这种写法是对类型的显式说明,但在这个例子中,效果与第四种写法完全相同。
<6>.总结:
- 总的来说,这五种写法的实际效果都是一样的,
都会创建一个动态分配的 file 对象
,并使用 std::unique_ptr 管理其内存
。 - 它们的
区别在于语法风格
和可读性
。