【C/C++】【智能指针】shared_ptr循环引用 循环引用问题 “循环引用”简单来说就是:两个对象互相使用一个shared_ptr成员变量指向对方的会造成循环引用。导致引用计数失效。 即A内部有指向B,B内部有指向A,这样对于A,B必定是在A析构后B才析构,对于B,A必定是在B析构后才析构A,这就是循环引用问题,违反常规,导...
当main()函数返回时,我们希望的是这两个共享指针都被销毁——但事实是它们两个都不会被删除,因为它们之间造成了循环引用。即使这两个智能指针本身被从栈上销毁,但由于它们指向的对象的引用计数都不为0而使得那两个对象永远不会被销毁。 下面是这段程序运行的输出结果: Aircraft type Maverick: F-14 is created ...
shared_ptr 是一个标准的共享所有权的智能指针,允许多个指针指向同一个对象. 定义在 memory 文件中(非memory.h), 命名空间为 std. shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使用引用计数的机制上提供了可以共享所有权的智能指针, 当然这需要额外的开销: (1) shared_...
在多线程环境中,如果一个线程释放了std::shared_ptr,而另一个线程还在使用从之前共享的std::shared_ptr得到的原始指针,那么后者的指针也可能变成悬空指针。 循环引用 如果两个或多个std::shared_ptr之间存在循环引用,并且没有其他方式打破这个循环,这些std::shared_ptr将永远不会释放它们所指向的对象,从而可能导致...
1、独占对象的所有权,由于没有引用计数,因此性能较好 2、共享对象的所有权,但性能略差 3、配合,解决循环引用的问题 由于性能问题,那么可以粗暴的理解:优先使用。但由于不能进行复制,因此部分场景下不能使用的。 3.1.1 unique_ptr 的使用场景 一般在不需要多个指向同一个对象的指针时使用。但这个条件本身就很难判...
C 语言只有值的传递,无法直接传递引用,要想传递引用必须通过指针间接实现。 如果C 语言没有指针,一切都通过值传递,参数将永远只有输入参数,所有的结构体只要参与运算都具有极高的开销,因为每传递进函数参数一次就必须全体复制一次。 另外一点:C语言无法在参数中传递数组,一切数组在函数参数传递时退化为指针,因此如果没...
2. 嵌套指针释放不完全 释放指针数组时,不光需要释放对象的内存空间,还要释放其中的每个指针。如果只是释放对象的内存空间,就会导致释放不完全,造成内存泄漏。 // 数组指针 int (*a)[N] = new int[M][N]; // M元数组的头指针a,指向一个N元数组,N必须为已知 ...
1.使用智能指针(Smart Pointers) 智能指针是 C++ 中自动管理动态内存的工具,能够在对象超出作用域时自动释放内存,避免内存泄漏。我们将以Node类为例展示如何使用智能指针来管理对象。 std::unique_ptr:拥有对象的唯一所有权,不能复制或共享所有权。当unique_ptr超出作用域时,自动释放其管理的对象。
weak_ptr的主要使用场景,一是用于探查是否内存空间是否有效,用户可以通过expired()或者lock()来检测数据的有效性,以避免空指针。二是可以用于打破循环引用。c++20中的原子智能指针 智能指针的计数器是线程安全,但是其指向的对象的不是线程安全的。如果需要多个线程操作,为了保证安全性,可以 1、直接调用 mutex 的 ...
智能指针可能出现的问题:循环引用 比如定义了两个类 Parent、Child,在两个类中分别定义另一个类的对象的共享指针,由于在程序结束后,两个指针相互指向对方的内存空间,导致内存无法释放。 循环引用的解决方法: weak_ptr 循环引用:该被调用的析构函数没有被调用,从而出现了内存泄漏。