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

为什么我要在析构函数中使用Free而不是FreeAndNil?

在析构函数中使用Free而不是FreeAndNil的原因是因为它们有不同的作用和使用场景。

Free是一个通用的释放内存的方法,用于释放动态分配的内存对象。它会将对象的内存释放,并将指针设置为nil,但不会调用对象的析构函数。因此,在使用Free释放对象内存后,对象的指针仍然存在,但指向的内存已经无效。如果在之后继续使用该指针,可能会导致访问无效内存的错误。

而FreeAndNil是一个更安全和推荐的方法,它在释放内存的同时,还会将指针设置为nil,并调用对象的析构函数。这样可以确保对象被完全释放,并且指针被正确地设置为nil。使用FreeAndNil可以避免使用无效指针,减少潜在的错误。

在析构函数中使用Free而不是FreeAndNil的原因是,析构函数在对象销毁时会自动调用,因此不需要手动将指针设置为nil。而且,在析构函数中使用FreeAndNil可能会导致重复释放对象内存的错误,因为对象已经在析构函数中自动释放了。

总结起来,使用FreeAndNil可以更安全地释放对象内存并避免潜在的错误,而在析构函数中使用Free可以简化代码并避免重复释放内存的错误。根据具体的使用场景和需求,选择合适的方法来释放对象内存。

相关搜索:为什么析构函数不是从函数中调用返回的对象?为什么我的.net析构函数不是在这个非常简单的场景中调用的?为什么我必须在指针上使用free而不是正常的声明?为什么yyclearin的使用不能在野牛中触发%析构函数为什么我需要在forloop中声明长度,而不是直接使用它?为什么我需要在g ++中使用typedef typename而不是VS?我为什么要在循环中使用foreach而不是for(int i = 0; i <length; i ++)?我需要在中使用变量,而不是shell脚本awk中的直接日期在C++中,为什么使用静态类函数而不是常规函数?SQL:为什么我必须在这里使用IN函数,而不是等号和OR?在Angular中,为什么要使用管道而不是原生JavaScript函数?在VB.NET中我为什么要使用Select而不是If?为什么我的函数使用原始列表,而不是我在调用该函数时用于参数的副本?对于ReactJS中的页面,我应该使用函数而不是类吗?如果我要在IIS中托管WCF服务,使用WCF服务而不是WCF库有什么好处?当析构函数是私有的时,我应该如何在c++11中使用唯一指针?为什么SQL server在我的表中插入0值,而不是使用函数插入正确的值?我需要在R中为mean创建一个函数,而不使用基本函数mean()或sum()在ReactJS中,我如何使用函数而不是类组件重写以下代码?为了一次显示一个元素而不是显示所有元素,我需要在切换函数中更改什么?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++动态分配浅析

1. c语言中动态分配和释放 在c中,申请动态内存是使用malloc和free,这两个函数是c的标准库函数,分配内存使用的是系统调用,使用它们必须包含stdlib.h,才能编译通过。...malloc后需要检查内存是否分配成功,free则要在指针不为空的情况下才能进行。...需要注意的是:new的不是数组的话,则直接delete就好,并且只会调用一次析构函数,而new[]的话,则需使用delete[]来释放,并且数组中每一个元素都会调用一次析构函数,调用完析构函数再释放内存...,而operator delete里面则是调用的free函数。...如果没有储存数组大小,编译器就不知道应该调用几次析构函数; new[]分配的内存只能由delete[]释放,如果由delete释放会崩溃,为什么会崩溃呢?

67330

C++:内存管理|new和delete

,new会调用构造函数,delete会调用析构函数,而malloc与 free不会。...,所以用delete和free没什么区别 3.4.2 结构体类型 自定义类型,构造函数和析构函数都会处理,但如果我们用free,就少调了一次析构函数,但是该类的析构函数并不需要清理资源,所不调用也是无所谓的...同理如果delete p9也是这样的问题,他并不懂得delete [ ]的释放机制,会导致释放位置错误而崩溃!!! 如上图,我把析构函数给注释掉了,为什么这个时候free就成功了???...3、析构函数一般只在涉及资源清理的时候比较有必要存在,其他情况下就不是很有必要。...申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

13910
  • 腾讯大连电话面试题目

    5.为什么在用迭代遍历vector的过程中不宜修改vector里面元素的值?从工程的角度考虑。 6.从工程的角度来说,有什么功能是new能做到而malloc做不到的。...1)它们都可用于申请动态内存和释放内存。 2)malloc是库函数只能作用于内部数据类型,对于非内部数据动态对象而言,就不能完成对象的初始化与销毁,即执行构造函数与析构函数,而new 与 delete...此类运算符就能够在编译器的控制权限内完成,对象的初始化与销毁任务,即执行构造函数与析构函数。 为什么C++不把malloc/free淘汰出局呢 既然new/delete的功能完全覆盖了malloc/...”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。 注意:如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。 如果用delete...我说gnu,人家说没有人直接用gnu,提示我,“你编译的时候在命令行里敲什么代码?”。好吧,我说gcc。面试官说你是不是没编译过大型的工程。 8.那你平时使用什么IDE。

    64820

    CC++面试常问题集(2)

    6、哪些成员函数不能被继承? C++中,并不是所有的成员函数都能被子类继承,有三类成员函数不能被子类继承,分别是:构造函数(包括拷贝构造)、析构函数、赋值运算符重载函数。...三,赋值运算符重载函数  赋值运算符重载函数也不会被子类继承,只是在子类的赋值运算符重载函数中会调用父类的赋值运算符重载函数。 7、基类的析构函数为什么要用virtual虚析构函数?...假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...它们都可用于申请动态内存和释放内存; new/delete会调用对象的构造/析构函数, 而malloc/free只会分配/释放内存; malloc与free是C++/C语言的标准库函数,new/delete.../free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free; malloc一个对象会发生什么事呢?

    1.2K10

    C++ 中 mallocfree与 newdelete区别

    由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free 。...如果用 free 释放“ new 创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。...由于,malloc/free是库函数而不是运算符,不在编译器控制权限之内,也就不能执行构造函数和析构函数,不能够把执行构造函数和析构函数的任务强加于malloc/free。...new/delete不是库函数,而是运算符。 而对于内部数据类型,由于内部数据类型的对象没有构造函数与析构函数的过程,对他们来说,malloc/free与new/delete是等价的。...或许你会问,既然new/delete的功能完全可以实现malloc/free的功能,为什么C++中不把malloc/free淘汰掉呢,这可能涉及到一个兼容性问题,C++程序要经常调用C函数,而C语言中只能用

    95420

    malloc和new有什么区别

    malloc和new有以下不同: new、delete是操作符,可以重载,只能在c++中使用。 malloc、free是函数,可以覆盖,c、c++中都可以使用。...new可以调用对象的构造函数,对应的delete调用相应的析构函数。 malloc仅仅负责分配内存,free仅仅回收内存,并不执行构造和析构函数。...它们都可用于申请动态内存和释放内存 对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构 函数。...由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。...对于内部数据类型的“对象”没有构造与析构过程,对它们而言,malloc/free和new/delete是等价的。为什么C++不把malloc /free淘汰出局呢?

    823100

    【C++课程学习】:new和delete为什么要配套使用,new,delete和malloc,free的比较

    ⌚️不同点: 1.new,delete是操作符,malloc,free是函数。 操作符和函数的区别: 1.操作符在编译的过程就进行了替代,而函数要在运行中进行调用。...5.是否主动调用构造函数和析构函数: 在处理自定义类型的时候,new会调用构造函数,delete会主动调用析构函数对类里面的空间进行清理。但是malloc和free就不会调用。...,delete会调用析构函数。...⌚️delete的原理: 1.执行析构函数对对象中的资源进行清理。 2.调用operator delete对对象进行清理 new T[ ]和delete[ ]原理和上面类似。...3.为什么尽量要new和delete配套使用,malloc(calloc,realloc)和free配套使用?

    8800

    初识C++ · 内存管理

    在C++中内存管理是使用new 和 delete来实现的,这两个都是C++中的标识符,和C语言不同的是C++实现内存管理不是用的函数。...3.2 delete 同C语言,开辟了空间,使用完就要还给操作系统,C语言中使用的是free,在C++中使用的是delete,delete = operator delete+ 析构,而operator...在2019中,我们进入到operator new中就可以看到: 我们明明只要40个字节,却多开了4个字节,但是当我们注释掉析构函数之后,我们再去调试,就会发现size变成了40,也就是有没有显式调用析构函数会影响实际开辟的空间大小...用malloc函数开辟的我用delete,用new的我用free,你说可行吗?...实际上对于内置类型来说是没有问题的,因为不会涉及多开空间的问题,也就不会涉及越界的问题,那么对于自定义类型来说: 当我们显式调用了析构函数,使用free就会出问题,其实不管是free还是delete都会出问题

    6210

    C++初阶 内存管理和模板

    为了和new配套使用,同样也是为了处理自定义类型,delete的超级好处便是自定义类型走完它的生命周期后会走它的析构函数对变量进行处理 2.3使用delete 1.用new+类型 这种方式创建出来的空间...,直接delete+空间首地址即可 2.用new+类型+[n] 这种方式创建出来的空间,得delete[]+空间首地址 不匹配使用的话程序可能会崩溃 可以看出,delete会调用对应类的析构函数...申请自定义类型对象时,malloc / free只会开辟空间,不会调用构造函数与析构函数,而new 在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成 空间中资源的清理...在生活中我们经常会使用到交换函数,但是交换函数往往会涉及到不同的变量,这就令人沮丧,因为这意味着我们得根据不同的变量来因地制宜地写函数,而模板的出现便杜绝了这一情况,一个swap便可以代表所有...然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类,因此不难看出它的用途,以前我们写栈得搞个typedef int StackType 现在不再需要,直接上就能够有所有类型的栈

    9510

    【C++】CC++内存管理

    当然: 如果对应的构造函数有参数,我们new的同时也可以传参: 所以: 在申请和释放自定义类型的空间时,new会自动调用构造函数,delete会自动调用析构函数,而malloc与free不会。...是不是要看情况啊,如果类中不存在资源申请(比如我们之前实现的日期类),是不是不析构也不会有什么问题;但如果类中存在资源申请(栈Stack类),那我们不析构的话是不是就内存泄漏了啊。...这些都不是报错的真正原因,我们上面说过了,没调析构函数,即使内存泄漏也不会报出来的。...那再给大家说一个东西: 刚才我们用delete和free程序不是都崩溃了嘛,那我们现在做这样一件事: 把析构函数注释掉。然后: 我们发现delete就不报错了。 为什么呢?...申请自定义类型对象时,malloc/free只会开辟和释放空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

    18310

    【C++内存管理】—— 策略、陷阱及应对之道

    ,然后继续逐语句调试,我们跳转进入类A的析构函数内部查看反汇编代码如下: 我们发现类A的析构函数在内部除了清理资源,还调用了operator delete函数 继续调试中可以使用F11键(或选择“调试”...如果你在 new 表达式中不使用 [ ],一定不要在相应的 delete 表达式中使用 [ ]。 为什么new new[]、delete delete[]必须要配对使用呢?...对于自定义类型A,delete只会调用一次析构函数,而不是为数组中的每个对象调用,这样会导致数组中其他对象的资源无法正常释放,造成内存泄漏。...如果尝试使用 delete 释放由 malloc 分配的内存,虽然在某些简单情况下可能不会立即出现问题,但由于 delete 会尝试调用析构函数,而 malloc分配的内存没有经过构造函数初始化,调用析构函数可能会导致未定义行为...比较项 free delete 类型 C语言标准库函数,在C++中也可使用 C++中的操作符 功能 仅释放由malloc、calloc、realloc分配的内存块,不调用对象的析构函数 释放由new分配的内存

    7610

    【C++】动态内存管理:织梦寻优,在代码世界中编织高效内存的诗篇

    ,然后我们最后释放arr的时候,会调用10次析构,我们来运行一下程序看看是不是这样的,如下:     可以看到确实如我们预期所料,这里调用了10次构造和析构,但是有的同学可能就有疑问了,delete...就已经释放空间了,为什么还要继续调用析构呢?...,并且使用new去申请了一个对象,随后直接将它释放掉,我们主要关注的是为什么delete和delete[]释放空间前要调用析构函数,我们画一个示意图,如下:     当我们开辟好空间后,pst指向了一个堆上的...stack对象,然后stack中的_arr成员变量就指向了一个堆上的整型数组,我们来看看delete不自动调用stack的析构而直接释放stack对象会怎么样,如图:     可以看到这个时候程序就会出问题...,是C++解决错误的方式,而不是依靠返回值,由于涉及到继承等其它知识,这里就简单说一下就好了     总之只需要知道为什么我们不直接使用malloc,而是将malloc封装成为operator new

    6810

    深入解析CC++内存管理:new与delete的使用及原理

    N次析构函数,完成N个对象中资源的清理 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间 通过汇编,深入立即其中 对于自定义类型转换指令只有两个核心动作调用全局函数及其构造或析构...为什么p2指向大小为44字节空间,而不是40字节空间 为什么编译器知道p2需要调用10次析构函数 回答: 由于new属于操作符,在编译时就计算出了所需空间的大小。...编译器在所开辟空间位置前面,也是调用operator new函数多开四个字节,用于记录对象个数(针对自定义类型) 由于内置类型不需要调用析构函数,对此不需要记录对象个数,而自定义类型需要记录对象个数。...由于编译器会自动生成析构函数,而该析构函数没有发挥占用,编译器会优化导致不需要四个字节记录对象个数,具体需要看编译器是否优化 六、malloc/free系列和new/delete系列的区别 我们将通过用法和底层特性两点说明...申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要的,但是new需要捕获异常 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化

    22210

    【C++】C&C++内存管理

    而char2数组中的内容实际上是从常量区中的常量字符串拷贝过来的,所以* char2指向的不是常量区中的字符a,指向的是栈区中拷贝到数组char2里面的字符串中的字符a。...A* p3 = new A; delete[]p3;//这样就会出现意料不到的错误,我的编译器出现了死循环,疯狂调用析构函数,停不下来根本。...= 析构 + operator delete函数(底层还是_free_dbg,和free一样的底层函数) return 0; } 3....但是吧,这样的使用方式太挫了,寂然一行代码可以解决的问题,我为什么还要先malloc在定位new表达式将已开辟空间初始化呢?这不是把原来一步就可以完成的工作硬生生拆分为两步吗?...申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理 b.malloc

    1.2K20

    globalalloc、malloc和new的区别

    对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。...由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 ...函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。...由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。 ...这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。  如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。

    1.6K20

    C++(六个默认成员函数)

    特征: 析构函数和构造函数类似函数名和构造函数稍微有点区别,只需要在类名前面加上一个~,就是析构函数。...,我在析构函数中加了一个cout,如果编译器自动调用了,则会在屏幕上打印一个~Stack,反之则不会打印。...如果类中没有申请资源,析构函数可以不写,直接使用编译器生成的析构函数,比如:Date类,如Stack类的就需要自己完善一个析构函数。...,最后就会崩溃,接下来用图来展示:: 如果没有显式定义拷贝构造函数则编译器会自动生成一个默认的拷贝构造函数,并且在调用的时候会成功,但是需要注意的是这里编译器生成的拷贝构造函数是浅拷贝,而不是深拷贝...如果类需要在对象销毁时执行特定操作,比如释放资源或者清理其他状态,就需要显式定义析构函数。

    10410

    C++|内存管理|new cookie实验

    正式实验 在继续查阅了其他资料之后,我得知了new的机制和malloc存在差异,例如malloc/free本身只需要宣告内存被占用/释放即可,而new/delete却要完成对应的构造/析构操作,如果仅仅存储字节大小...实验结果 在使用class封装int并添加上构造/析构函数后,我又一次对INT[32]探测了内存。...实验结论 对于栈中的自动对象,int a[5]等,直接由编译器提供大小,作为一种立即数直接参与汇编码中,这也是为什么栈数组必须使用常数的缘故,因为作为代码的一部分这必须是编译期间已知的。...对于堆上的内置类型或POD结构体(int,char等等),不存储大小,因为编译器根本无需析构,也没有必要知道数组具体的大小。内存的释放由malloc/free存储的字节大小处理即可。...对于堆上有构造或者析构函数的对象,在分配的对象前一段内存处分配size_t的大小存储大小,这段代码称为new cookie

    59730

    C++智能指针

    而为什么不会像auto_ptr这样犯糊涂了,这是因为这次有了先锋者,C++委员会一部分人作为先锋者,对C++一些语法做了很多的尝试,最终形成的产物就是boost库,而C++11就是吸取boost库中精华的部分...在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一。...-1,然后n1的生命周期结束,n1调用自己的析构函数,引用计数减为零,清理n1资源,而n1的_next指向n2, 所以同时会调用n2的析构函数,那么n2引用计数也减为零,n2清理资源。   ...那么我们就来分析一下,这个代码为什么会内存泄漏: 首先,假设n1的生命周期先到,那么n1调用析构函数,n1的引用计数减一,剩余1。...此时双方的引用计数都为1,n1要想析构,需要由n2先析构(因为n2._prev管理着n1,当n2 delete时,会自动调用n1的析构函数),而n2要想析构,需要n1先析构(n1.

    9010

    Envoy源码分析之Dispatcher

    ,这里使用两个vector存放,为什么要这样做呢?。...,调用deferredDelete即可,这个函数内部会通过current_to_delete_把对象放到要延迟析构的列表中,最后判断下当前要延迟析构的列表大小是否是1,如果是1表明这是第一次添加延迟析构的对象...沿着这个思路想一想,是不是只要保证对象析构的时候没有callback正在运行就可以解决问题了呢?是的,只要保证所有在执行中的callback执行完了,再做对象析构就可以了。...另外一个我觉得比较奇怪的是,为什么在DeferredDeletable的实现中要用to_delete_1_和to_delete_2_两个队列交替来存放,其实按照我的理解一个队列即可,因为clearDeferredDeleteList...但是Envoy中没有这样做,我理解这样设计的原因可能是因为相比于任务队列来说延迟析构的重要性更低一些,大量对象的析构如果保存在一个队列中循环的进行析构势必会影响其他关键任务的执行,所以这里拆分成两个队列

    1.7K40

    C++奇迹之旅:C++内存管理的机制(进阶篇)

    new和delete操作自定义类型 我们先看malloc与free,调试可以发现并不会调用析构函数 class A { public: A(int a = 0) : _a(a) { cout...在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理 4....总结:都开4byte存储对象个数,方便delete[]时,知道有多少个对象,要调用多少次析构函数 内置类型就没有额外开空间: 因为,内置类型已经固定好,无需调用析构函数 int* p3 = new...new(p1)A; 使用"定位new"的语法在已分配的内存空间上构造一个A对象。如果A类的构造函数有参数,需要在这里传入参数,例如new(p2)A(10);。...p1->~A(); 显式地调用A对象的析构函数,释放对象占用的资源。 free(p1); free()函数释放之前使用malloc()分配的内存空间。

    17810
    领券