首页
学习
活动
专区
工具
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.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    智能指针

    如智能指针等。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类,将前后指针改成智能指针。...定制删除器 定制删除器是针对智能指针管理的类型定制专用的删除器,如果没有制删除器可能会出现一些错误。

    33920

    智能指针

    智能指针辅助管理: 使用智能指针将资源的释放交给其析构函数处理 RAII 和智能指针的设计思路详解 在C++开发中,资源管理(如内存、文件、网络连接等)是一个常见且关键的问题。...智能指针 VS 原生指针 特性 原生指针 智能指针 资源释放 手动调用 delete 析构函数自动释放 异常安全性 容易造成资源泄漏 保证异常安全 使用复杂度 需要手动管理资源 自动化管理,降低复杂度...RAII 思想 RAII 是智能指针的核心设计思想,资源的获取和释放分别绑定到智能指针对象的构造函数和析构函数中: 构造函数:获取资源(如内存、文件句柄等)。 析构函数:释放资源。...避免出现多重分配、重复释放或忘记释放的问题。 使用智能指针 使用智能指针(如 std::unique_ptr 和 std::shared_ptr)自动管理内存资源。...智能指针利用 RAII 原则,绑定资源的生命周期到智能指针的作用域,程序离开作用域时自动释放资源。 避免使用 raw pointer(裸指针)。

    30410

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

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

    17710

    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.7K20

    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): 不管计数器是什么值,对象都不会被自动释放,这样就退化成为没有使用智能指针一样,需要你自己手动释放。

    62440

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

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

    12910

    十五、智能指针

    它们旨在自动释放所拥有的对象,从而解决因忘记释放内存而导致的内存泄漏问题。C++标准库提供了几种不同类型的智能指针,每种都有其特定的用途和行为。...以下是使用智能指针的几个主要原因: 自动内存管理: 智能指针可以自动管理其所指向的动态分配内存的生命周期。这意味着当智能指针离开其作用域或被显式重置时,它们所指向的内存会被自动释放。...简化资源管理: 在处理复杂的数据结构或需要多重资源管理的场景中(如文件句柄、网络连接等),智能指针可以简化资源的获取、使用和释放过程。...通过封装资源的获取和释放逻辑,智能指针使得资源管理更加一致和可靠。 提高代码安全性: 使用智能指针可以减少由于异常处理不当或忘记释放内存而导致的程序崩溃。...通过将对象的生命周期与其所管理的资源绑定,RAII确保了在对象销毁时资源被自动释放。智能指针是实现RAII原则的重要工具之一。

    9510

    智能指针详解

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

    34340

    智能指针探究

    实现简易智能指针 #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释放的 所以在我们除了智能指针在堆内存外,怎么正确指导智能指针来正确删除呢

    9210

    指针+数组指针+字符指针+指针数组

    指针 指针作为C语言的核心部分,相比较其他的内容相对比较难懂一下,应用的方式多样,变化较多,导致很多的同学非常苦恼,那么接下来,我将陪你来共同揭开指针的神秘面纱; 指针的含义 大家不要把指针想的太难,指针其实就是通过地址找到对应的变量的位置...,然后我们可以对地址进行解引用来访问变量的内存,来获取值的一种间接方法;我们通常说指针指向哪里哪里,就是指针变量里面存的其他变量(或者常量)的地址;即  指针->地址->内存; 普通变量指针 首先,我们现来看看指针的构成以及表达形式...; 数组指针 数值指针,其主体是指针,他就是个指针,不过是有点不同而已,这个指针指向的是数组的地址,在此之前我们需要了解数组的地址; 数组的地址; 我们通常说数组的地址是数组名,是数组的首元素地址,也确实是这样...字符指针 含义 字符指针就是指针指向了字符或者字符串,因为字符串可以看成是一个字符数组,所以字符串指针与数组指针大致可以类比; 字符指针打印字符串 这里我使用了三种打印字符串的方式,从结果上看,很明显打出来的字符串都是相同的...指针数组 含义 指针数组,主体是数组,不同的是里面存的是指针,是地址; 指针数组打印二维数组 值得注意的是指针数组的[]前面的*p是没有括号的,我们可以这样看,他是一个数组,数组名是p,数组元素个数是3

    7510

    智能指针(一)

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

    86210

    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
    领券