智能指针unique_ptr的使用
定义
template<class T, class Deleter = std::default_delete<T>> class unique_ptr;
template <class T, class Deleter>
class unique_ptr<T[], Deleter>;
std::unique_ptr
是通过指针占有并管理另一对象, 并在unique_ptr
离开作用域时释放该对象的智能指针。
释放对象的时机-> :
- 销毁了管理的unique_ptr对象
- 通过operator= 或 reset() 赋值另一指针给管理的 unique_ptr对象
也可以通过调用get_deleter()(ptr) 删除对象;
unique_ptr 是可以转义对象的管理权的,但是被const修饰之后就不能够被转移了
常用的成员函数
函数名字 | 作用 |
---|---|
operator= | 赋值 |
reset | 替换被管理对象 |
swap | 交换被管理对象 |
release | 返回被管理对象的指针,并且释放一个对象所有权 |
get | 返回被管理对象的指针 |
常用的非成员函数
函数名字 | 作用 |
---|---|
make_unique | 创建一个管理对象的独占指针 |
std::swap(std::unique_ptr) | 特化 std::swap 算法 |
示例代码
struct Base {
// 创建一个虚函数
virtual void bar() { std::cout << "Base::bar()\n"; }
virtual ~Base() = default;
std::string val;
};
struct Derived : Base {
Derived() { std::cout << "Derived::Constructor\n"; }
~Derived() { std::cout << "Derived::Descontructor\n"; }
void bar() override { std::cout << "Derived::bar()\n"; }
std::string val;
};
int main()
{
std::cout << "\nunique_ptr 指向对象的所有权的测试---->\n";
{
// ptr_Derived拥有对象的所有权
auto ptr_Derived = std::make_unique<Derived> ();
ptr_Derived->val = "unique_ptr";
auto ptr_MoveD = std::move(ptr_Derived); //ptr_Derived 不在拥有对象所有权
assert(!ptr_Derived); //ptr_Derived为empty
ptr_MoveD->bar();
std::cout << ptr_MoveD->val << std::endl;
// 这里将会调用一次Derived的析构函数
}
std::cout << "\n多态运行时测试----->\n";
{
std::unique_ptr<Base> p_base = std::make_unique<Derived>(); // p_base是指向基类的指针,但是占有D的unique_ptr
p_base->bar(); // 这里将调用的Derived的bar函数
std::vector<std::unique_ptr<Base>> v; // 容器也可以存储unique_ptr对象
v.push_back(std::move(p_base));
v.push_back(std::make_unique<Derived>());
v.emplace_back(new Derived);
for (auto& itr : v)
{
itr->bar();
}
// 这里将调用3次析构函数
}
std::cout << "\n数组形式的unique_str对象测试--->\n";
{
std::unique_ptr<Derived[]> parr{ new Derived[4] };
// 这里将调用4次析构函数
}
return 0;
}
运行结果
unique_ptr 指向对象的所有权的测试---->
Derived::Constructor
Derived::bar()
unique_ptr
Derived::Descontructor
多态运行时测试----->
Derived::Constructor
Derived::bar()
Derived::Constructor
Derived::Constructor
Derived::bar()
Derived::bar()
Derived::bar()
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor
数组形式的unique_str对象测试--->
Derived::Constructor
Derived::Constructor
Derived::Constructor
Derived::Constructor
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor
作者:醉曦
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】