📅  最后修改于: 2023-12-03 15:13:33.447000             🧑  作者: Mango
auto_ptr
是 C++98 标准中提供的智能指针,用于管理动态分配的资源的释放。然而,auto_ptr
存在一些问题,并在 C++11 标准中被废弃。
auto_ptr
拥有资源的唯一所有权。当 auto_ptr
被赋值给另一个 auto_ptr
或者销毁时,会自动释放已分配的内存。->
和 *
。#include <memory>
std::auto_ptr<int> ptr(new int(10));
std::cout << *ptr << std::endl; // 输出: 10
unique_ptr
是 C++11 标准中引入的智能指针,用于替代废弃的 auto_ptr
。
unique_ptr
同样也拥有资源的唯一所有权。当 unique_ptr
被赋值给另一个 unique_ptr
或者销毁时,会自动释放已分配的内存。->
和 *
。#include <memory>
std::unique_ptr<int> ptr(new int(10));
std::cout << *ptr << std::endl; // 输出: 10
shared_ptr
是 C++11 标准中引入的智能指针,可以方便地实现共享资源所有权。
shared_ptr
允许多个 shared_ptr
指向同一块内存资源,当最后一个 shared_ptr
被销毁时,会自动释放内存资源。->
和 *
。weak_ptr
判断是否资源已被释放。#include <memory>
std::shared_ptr<int> ptr1(new int(10));
std::shared_ptr<int> ptr2 = ptr1;
std::cout << *ptr2 << std::endl; // 输出: 10
weak_ptr
也是 C++11 标准中引入的智能指针,用于解决 shared_ptr
的循环引用问题。
weak_ptr
指向 shared_ptr
管理的对象,但并不拥有资源所有权。weak_ptr
通过检查生命周期是否结束来判断资源是否已被释放。weak_ptr
可以通过 lock
函数获取一个有效的 shared_ptr
对象,用于访问资源。*
和 ->
操作符访问资源,需要通过 lock()
转换为 shared_ptr
后使用。#include <memory>
std::shared_ptr<int> shared = std::make_shared<int>(10);
std::weak_ptr<int> weak(shared);
if (auto ptr = weak.lock()) {
std::cout << *ptr << std::endl; // 输出: 10
} else {
std::cout << "资源已被释放" << std::endl;
}
以上就是auto_ptr
,unique_ptr
,shared_ptr
和weak_ptr
四种智能指针的介绍。这些智能指针提供了更安全和方便的动态内存管理方式,可以有效地减少内存泄漏的风险。需要根据具体的情况选择合适的智能指针来管理资源。