C++11:智能指针(二)实战篇(附上实例)

目录

1、unique_ptr:

2、shared_ptr:

3、weak_ptr:

4、如何处理循环引用问题?


C++智能指针是一种用于管理动态分配的对象的指针,它可以自动释放所指向的对象,避免内存泄漏和悬空指针的问题。

C++标准库提供了三种智能指针:unique_ptr、shared_ptr和weak_ptr。

智能指针的基本知识可以看上一篇文章:C++11:智能指针(一)_智能指针c++11_Ivy_belief的博客-CSDN博客

1、unique_ptr:

unique_ptr是独占所有权的智能指针,它保证只有一个指针可以指向该对象。当unique_ptr超出作用域或被显式地释放时,它会自动删除所指向的对象。

std::unique_ptr ptr(new int(10));
// 使用ptr指向的对象

*ptr = 20;
// 不需要手动释放内存,unique_ptr会在超出作用域时自动释放

2、shared_ptr:

shared_ptr是共享所有权的智能指针,它可以被多个指针同时指向同一个对象。它使用引用计数来追踪对象的引用数量,并在引用计数为0时自动删除所指向的对象。

std::shared_ptr ptr1(new int(10));
std::shared_ptr ptr2 = ptr1;  // 多个指针指向同一个对象

// 使用ptr1或ptr2指向的对象

*ptr1 = 20;
*ptr2 = 30;
// 不需要手动释放内存,shared_ptr会在引用计数为0时自动释放

3、weak_ptr:

weak_ptr是一种弱引用的智能指针,它指向shared_ptr所管理的对象,但不会增加引用计数。weak_ptr可以用于解决shared_ptr循环引用的问题。

std::shared_ptr ptr1(new int(10));
std::weak_ptr ptr2 = ptr1;  // 弱引用指向ptr1所指向的对象

// 使用ptr1或ptr2指向的对象

*ptr1 = 20;
// 不需要手动释放内存,当所有shared_ptr释放后,weak_ptr无效

智能指针的使用可以简化内存管理,避免手动释放内存和悬空指针的问题。根据具体的需求,选择合适的智能指针来管理动态分配的对象,以提高代码的安全性和可维护性。

4、如何处理循环引用问题?

(1)如何处理循环引用问题取决于你使用的智能指针类型。

        当两个或多个对象相互引用时,可能会形成循环引用,导致内存泄漏,因为它们的引用计数永远不会达到0。

(2)一种常见的解决方案是使用weak_ptr来打破循环引用

        weak_ptr是一种弱引用的智能指针,它不会增加引用计数。在存在循环引用的情况下,可以将其中一个shared_ptr替换为weak_ptr,这样就不会导致引用计数无法减少。

(3)代码示例:

class B;  // 前向声明

class A 
{
public:
    std::shared_ptr bPtr;
};

class B 
{
public:
    std::weak_ptr aWeakPtr;
};

std::shared_ptr aPtr(new A());
std::shared_ptr bPtr(new B());

aPtr->bPtr = bPtr;
bPtr->aWeakPtr = aPtr;

在上面的示例中,A类和B类相互引用。为了避免循环引用,A类中的bPtr使用shared_ptr,而B类中的aWeakPtr使用weak_ptr。

通过使用weak_ptr,当所有shared_ptr释放后,循环引用中的对象会被正确地销毁,从而避免了内存泄漏。

需要注意的是,在使用weak_ptr时,需要检查weak_ptr是否有效(expired)才能访问所指向的对象,可以使用lock()方法来获取一个有效的shared_ptr。


std::shared_ptr aPtr = bPtr->aWeakPtr.lock();
if (aPtr) 
{
    // weak_ptr有效,可以访问aPtr所指向的对象
} 
else 
{
    // weak_ptr无效,aPtr已经被销毁
}

这样,你就可以通过使用weak_ptr来解决循环引用问题,并确保内存正确释放。

你可能感兴趣的:(#,c++新特性,1024程序员节,c++)