智能指针是一种用于自动管理动态内存分配的类模版,旨在减少手动管理内存带来的错误和复杂性。c++11标准库主要引入了三种智能指针。
1.std::shared_ptr
shared_ptr所使用的策略是跟踪引用特定对象的智能指针数,也就是引用计数,例如,赋值时,计数将加1,而指针过期时,计数将减1,仅当最后一个指针过期时才调用delete。
class MyClass
{
public:
MyClass(){std::cout<<"create class.";}
~MyClass(){std::cout<<"delete class.";}
}
int main()
{
std::shared_ptr<MyClass> p1(new MyClass());
std::shared_ptr<MyClass> p2 = p1;
//当p1和p2都被销毁时,MyClass实例才被释放
return 0;
}
2.std::unique_ptr
unique_ptr 是一种独占所有权的智能指针,意味着同一时间只能有一个 unique_ptr 拥有某个资源。当 unique_ptr 被销毁时,它所管理的资源也会被自动释放。
int main()
{
std::unique_ptr<MyClass> p1(new MyClass());
std::unique_ptr<MyClass> p2 = p1;//编译报错 不能复制
std::unique_ptr<MyClass> p3 = std::move(p1);//支持移动语义,所有权转换,p1被销毁
return 0;
}
3.std::weak_ptr
weak_ptr 是一种不拥有资源的智能指针,它是对 std::shared_ptr 的一种弱引用,不会增加资源的引用计数。weak_ptr 常用于解决 shared_ptr 之间的循环引用问题。不能直接访问资源,必须通过 lock 方法获取 shared_ptr 临时访问资源。
int main() {
std::shared_ptr<MyClass> ptr1(new MyClass());
std::weak_ptr<MyClass> weakPtr = ptr1; // 不增加引用计数
{
std::shared_ptr<MyClass> ptr2 = weakPtr.lock(); // 获取共享所有权
if (ptr2)
{
std::cout << "Successfully locked weak_ptr\n";
}
else
{
std::cout << "Failed to lock weak_ptr (resource already freed)\n";
}
}
// ptr2 离开作用域后被销毁,但不会影响到 MyClass 的实例,因为 weakPtr 不拥有它
// 当 ptr1 被销毁时,MyClass 的实例才会被释放
return 0;
11万+

被折叠的 条评论
为什么被折叠?



