首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C 语言】二级指针案例 ( 多级指针内存释放问题 | 多级指针避免野指针 )

文章目录 一、多级指针内存释放 1、多级指针内存释放 ( 执行顺利的情况 ) 2、分配内存出错处理情况 二、完整代码示例 一、多级指针内存释放 ---- 1、多级指针内存释放 ( 执行顺利的情况 )...释放 n 级指针 , 如果执行顺利 , 正常释放该 n 级指针 , 需要按照如下规则进行释放 : 先释放 1 级指针 , 释放完毕后 , 将释放指针设置为 NULL ; 再释放 2 级指针..., 释放完毕后 , 将释放指针设置为 NULL ; 然后释放 3 级指针 , 释放完毕后 , 将释放指针设置为 NULL ; \vdots 最终释放 n 级指针 , 释放完毕后 , 将释放指针设置为...NULL ; 先释放 低级指针 , 然后逐级提高释放指针 的 层级 , 最后释放 高级指针 ; 如果先把 高级指针 释放了 , 则找不到低级指针 ; 代码示例 : /** * @brief free_memory...} // 先释放 二级指针 指向的 一级指针 内存 for (i=0; i < count; i++) { // 如果 一级指针 不为空才释放

2.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    智能指针

    智能指针等。2、事后查错型。如泄 漏检测工具。...delete n1上面如果抛异常了呢,所以就需要智能指针 这里报错的原因(类型不匹配)是因为一个自定义类型一个内置类型,要把上面的也改成智能指针,所以要改成如下图 正常释放(shared_ptr) 这样就发生了循环引用...,没法正常释放空间,屏蔽其中一个就没问题,但两个都有就不行了 解决方法(weak_ptr不是智能指针) / 解决方案:在引用计数的场景下,把节点中的_prev和_next改成weak_ptr就可以了 /...make_shared 的主要目的是简化智能指针的创建过程,并可能提供性能上的优化。...C++98版本中已经存在的 B.auto_ptr的多个对象之间,不能共享资源 C.auto_ptr的实现原理是资源的转移 3: C++11中提供的智能指针都只能管理单个对象的资源,没有提供管理一段空间资源的智能指针

    8010

    智能指针

    RAII 在了解智能指针之前,我们需要先要了解RAII,那么什么是RAII呢?...智能指针 上边的SmartPtr类,就是RAII,但是只有管理资源释放的功能,并没有指针解引用和->的操作,不能对管理的资源进行控制,那么我们如何让SmartPtr支持像指针一样的行为呢?...这里我们将引入智能指针的概念,并且简要的模拟四种库的智能指针,理解原理 智能指针的原理如下: RAII特性 重载operator * 和opertaor->,具有像指针一样的行为。...循环引用 问题的引入:我们有个节点类,用shared_ptr会发生什么样的问题,我们来看一下下面 上边说share_ptr的对象不能给Node*,我们可以更改一个Node类,将前后指针改成智能指针。...定制删除器 定制删除器是针对智能指针管理的类型定制专用的删除器,如果没有制删除器可能会出现一些错误。

    33820

    C++智能指针详解(共享指针,唯一指针,自动指针

    前言:智能指针在C++11中引入,分为三类: shared_ptr:共享指针 unique_ptr:唯一指针 auto_ptr:自动指针 一、共享指针 几个共享指针可以指向同一个对象; 每当shared_ptr...:当一个对象被引用了多次时,那么这个对象的引用基数就会变大;当销毁引用这个对象的智能指针时,这个对象的引用基数就会变小;当引用基数变为0时,那么这个被引用对象就会被销毁,不会产生内存泄露的风险 UNIT2...; 只能使用智能指针特定的强制转换运算符: static_pointer_cast dynamic_pointer_cast const_pointer_cast UNIT4:线程安全 共享指针不是线程安全的...//Perform some operations } 唯一指针可以解决func1和func2函数中资源释放的问题。 2....C++98中存在,于C++11中使用唯一指针替换其它 四、智能指针接口汇总 API Name Func Def weak_ptr wp 默认构造函数;创建一个空的弱指针 weak_ptr wp(wp2

    1.6K20

    Boost C++ 库 | 智能指针(共享指针、共享数组、弱指针、介入式指针指针容器)入门

    它可以和其他 boost::shared_ptr 类型的智能指针共享所有权。在这种情况下,当引用对象的最后一个智能指针销毁后,对象才会被释放。...不过它之前所包含的对象并没有被释放,因为 i2 仍然引用着它。智能指针 boost::shared_ptr 记录了有多少个共享指针在引用同一个对象,只有在最后一个共享指针销毁时才会释放这个对象。...02、共享数组>>>共享数组的行为类似于共享指针。关键不同在于共享数组在析构时,默认使用 delete[] 操作符来释放所含的对象。...弱指针本身对于对象的生存期没有任何影响。 lock() 返回一个共享指针,print() 函数就可以安全的访问对象了。这就保证了——即使另一个线程要释放对象——由于我们有返回的共享指针,对象依然存在。...Boost C++ 库 | 智能指针(RAII、作用域指针、作用域数组)

    11110

    智能指针探究

    实现简易智能指针 #include using namespace std; // 智能指针 保证能做到资源的自动释放 // 智能指针实际利用栈上的对象出作用域自动析构的特征,来做到资源的自动释放...// CSmartPtr *p = new CSmartPtr(new int); delete p;这时候p是指向堆的智能指针,所以也要手动释放,这样就没啥意义了,还不如直接使用裸指针...这样做会调用该对象的析构函数来清理它所占用的资源,然后释放为它分配的内存 shared_ptr的交叉引用问题 shared_ptr:强智能指针,可以改变资源的引用计数 weak_ptr:弱智能指针,不会改变资源的引用计数...因此,在使用 detach() 方法时应谨慎 自定义删除器 智能指针:能够保证资源的绝对释放,里面默认都是delete ptr释放资源的 但不是所有的资源都是能够通过delete释放的,毕竟资源那么多种类...比如我用智能指针托管数组的话,那delete就不行,得用delete[] 再比如我让它管理的不是内存资源,而是文件资源,那释放文件也绝对不可能用delete释放的 所以在我们除了智能指针在堆内存外,怎么正确指导智能指针来正确删除呢

    8610

    智能指针详解

    为什么引入智能指针? 内存泄漏问题 C++在堆上申请内存后,需要手动对内存进行释放。随着代码日趋复杂和协作者的增多,很难保证内存都被正确释放,因此很容易导致内存泄漏。...而智能指针设计的初衷就是可以帮助我们管理堆上申请的内存,即开发者只需要申请,释放内存的任务交给智能指针。用于确保程序不存在内存和资源泄漏且是异常安全的。...智能指针的特点包括: 拥有权管理:智能指针拥有其所指向的对象,负责在适当的时机释放内存。这意味着当智能指针超出作用域或不再需要时,它会自动调用析构函数来释放内存。...析构函数处理:智能指针的析构函数中通常包含了对所拥有对象的内存释放操作,确保在智能指针被销毁时,关联的资源也会被释放。这种自动化的资源管理有助于避免内存泄漏和资源泄漏。...异常安全性:智能指针在异常情况下能够保证资源的正确释放。即使发生异常,智能指针也会在其作用域结束时被销毁,并调用析构函数来释放资源。

    30340

    rust智能指针

    智能指针 智能指针虽然也号称指针,但是它是一个复杂的家伙:通过比引用更复杂的数据结构,包含比引用更多的信息,例如元数据,当前长度,最大可用长度等。...智能指针往往是基于结构体实现,它与我们自定义的结构体最大的区别在于它实现了 Deref 和 Drop 特征: Deref 可以让智能指针像引用那样工作,这样你就可以写出同时支持智能指针和引用的代码,例如...解引用操作,你需要使用 * 操作符来显式的进行解引用; num持有的智能指针将在作用域结束(main 函数结束)时,被释放掉,这是因为 Box 实现了 Drop 特征 避免栈上数据的拷贝 当栈上数据转移所有权时...,这两个特征可以智能地帮助我们节省使用上的负担:Deref 可以让智能指针像引用那样工作,这样你就可以写出同时支持智能指针和引用的代码,例如 *T。...当 a、b 超出作用域后,引用计数会变成 0,最终智能指针和它指向的底层字符串都会被清理释放

    1.1K30

    Android智能指针

    智能指针其实就是帮我们管理这种内存空间,自动做到:不用了就释放掉。这里面有一个问题:它如何知道我们不用了?智能指针的解决方案是维护一个计数器。...轻量级智能指针: 其实就是最简单最常规的智能指针:构造器中增加计数器,析构器中减少计数器,当计数器为0,释放对象。...Android的智能指针还有一套释放策略:你可以指定flag,是以强计数器为参考来释放,还是以弱计数器为参考来释放,或者什么都不参考(forever不释放)。...当以强计数器为参考时:强计数器为0,对象就被释放。 当以弱计数器为参考时:强计数器为0,对象不被释放,假如弱计数器不为0,你还可以通过弱智能指针提升为强智能指针,然后正常使用。...当最后弱智能指针为0,对象被释放。 当什么都不参考时(forever): 不管计数器是什么值,对象都不会被自动释放,这样就退化成为没有使用智能指针一样,需要你自己手动释放

    61740

    智能指针(一)

    shared_ptr 智能指针也是模板的一种,所以创建时需要指出类型,,也支持和指针一样的解引用操作。...p.get()操作 p.get()的设计目的是当需要向不能用智能指针的地方传递一个内置指针时使用。...p.get()的作用是返回一个内置指针,指向智能指针指向的对象,并且返回的指针不能被delete 有几个注意点: 返回的指针不能被delete,因为如果delete就会销毁对象,那么之后智能指针就无法释放已经被释放的对象...auto p=make_shared(1); auto a=p.get() delete a; 返回的指针不能用于初始化另一个智能指针,这样会会有两个独立的智能指针指向同一个对象,并且引用计数都是...这样只要其中一个不再使用,所管理的内存就会被释放,另一个指针就变成空悬指针,使用就是非法的,同时会发生二次释放

    85610

    指针的艺术——四种智能指针

    传统指针需要手动管理内存的分配和释放,这容易导致内存泄漏和悬空指针等问题。...智能指针是一个对象,像指针一样工作,但同时负责管理所指向对象的生命周期。智能指针在其自身被销毁时,会自动释放所管理的内存,从而避免内存泄漏。...std::shared_ptr(共享,强引用) std::shared_ptr 是一个共享所有权的智能指针,允许多个指针指向同一个对象。该对象和其相关资源会在“最后⼀个引⽤被销毁”时候释放。...自动内存管理:智能指针自动管理内存的分配和释放,减少了内存泄漏的风险。...异常安全:在异常发生时,智能指针会自动释放资源,确保资源不被泄漏。 简化代码:通过智能指针,开发者可以专注于业务逻辑,而不必过多关注内存管理细节。

    11610

    CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

    普通变量和指针变量 共性 PS: 可见这4个函数的汇编指令完全一致,无论是什么类型的指针变量,对指针变量的读写跟普通变量没有任何区别,所谓的指向只是描述指针变量的值时多少而已,就读写而言,指针变量跟普通变量没有任何区别...空指针和野指针指针:定义了一个指针变量,如果没有进行初始化,系统就会有可能随机赋值一个地址给这个指针变量,也就是说,这个指向指向一个未知的区域。...空指针:空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针...指针变量的+-运算 指针变量的加减运算:也就是做地址偏移,不同 的指针类型偏移的步长不同。...图片 图片 PS: 区分指针数组int *a[3]和数组指针int (*a)[3],前者时存放指针的数组,后者是指向数组的指针

    1.7K30

    CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

    普通变量和指针变量 共性 PS: 可见这4个函数的汇编指令完全一致,无论是什么类型的指针变量,对指针变量的读写跟普通变量没有任何区别,所谓的指向只是描述指针变量的值时多少而已,就读写而言,指针变量跟普通变量没有任何区别...空指针和野指针指针:定义了一个指针变量,如果没有进行初始化,系统就会有可能随机赋值一个地址给这个指针变量,也就是说,这个指向指向一个未知的区域。...空指针:空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针...PS: 区分指针数组int *a[3]和数组指针int (*a)[3],前者时存放指针的数组,后者是指向数组的指针。...这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

    1.7K20

    指针进阶(1)(字符指针指针数组,数组指针,函数指针

    前言: 本文主要讲解指针进阶部分的内容,分为字符指针指针数组,数组指针,函数指针。...int *arr[5];//存放整型地址的指针数组 char *arr[6];//存放字符类型的指针数组 数组指针 概念辨析 我们类比一下: 整型指针:指向整型变量的指针,存放整型变量的地址的指针。...数组指针:指向数组的指针,存放数组地址的指针。...形式辨析 int * p; 首先*表示这是一个指针,命名为p,然后指向的是int类型的指针,数组指针也一样 int(*p) [5]; 上面的形式就是数组指针,我们需要先用()把*和指针名括起来,然后剩下的就是指针指向的类型...数组接受时,行可以省略,但是列不能 指针接收,必须用数组指针来接收。 函数指针 函数指针就是指向函数的指针

    9410

    Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】

    不过系统为我们提供了智能指针,避免出现上述问题,本文将系统地分析Android系统智能指针(轻量级指针、强指针和弱指针)的实现原理。...这时候,智能指针就粉墨登场了。...首先,智能指针是一个对象,不过这个对象代表的是另外一个真实使用的对象,当智能指针指向实际对象的时候,就是智能指针对象创建的时候,当智能指针不再指向实际对象的时候,就是智能指针对象销毁的时候,我们知道,在...Android系统提供了强大的智能指针技术供我们使用,这些智能指针实现方案既包括简单的引用计数技术,也包括了复杂的引用计数技术,即对象既有强引用计数,也有弱引用计数,对应地,这三种智能指针分别就称为轻量级指针...就交给智能指针来处理了。

    1.9K20
    领券