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

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

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

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

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

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

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

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++动态分配浅析

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

63730

腾讯大连电话面试题目

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。

62920

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

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

9710

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

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

1.1K10

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语言中只能用

88620

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淘汰出局呢?

766100

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

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

6710

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

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

14210

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

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

56930

《C++Primer》第十三章 拷贝控制

在一个函数,不存在类似构造函数初始化列表的东西来控制成员如何销毁,部分是隐式的。成员销毁时发生什么完全依赖于成员的类型。销毁类类型的成员需要执行成员自己的函数。...三/五法则 4.1 需要函数的类也需要拷贝和赋值操作 当我们决定一个类是否要定义它自己版本的拷贝控制成员时,一个基本的原则是首先确定这个类是不是需要一个函数。...代码唯一可能抛出异常的就是拷贝构造函数的new表达式,如果真的异常,也会在改变左侧运算对象之前发生 动态内存管理类 某些类需要在运行时分配可变大小的内存空间,这种类通常使用标准库容器来保存它们的数据...为了避免这种潜在问题,vector除非直到元素类型的构造移动函数不会发生异常,否则在重新分配内存的过程它就必须使用拷贝构造函数不是移动构造函数。...当我们希望在vector重新分配内存这类情况下对我们自定义类型的对象进行移动不是拷贝,就必须显式地告诉标准库我们的移动构造函数不会发生异常,可以安全使用

1.6K40

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()分配的内存空间。

10010

Envoy源码分析之Dispatcher

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

1.6K40

【细品C++】C++动态内存管理

套件最大区别: // new/delete 对于自定义类型除了开空间还会调用构造函数函数 A* p1 = (A*)malloc(sizeof(A)); A* p2 = new A; free...(p1); delete[] p2; } 运行截图: 注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用函数malloc/free不会。...delete[]的原理 在释放的对象空间上执行N次函数,完成N个对象中资源的清理。...,因为构造函数没有执行 new(p1)A; p1->~A();//函数 显式调用公有成员函数 free(p1); A* p2 = (A*)operator new(sizeof A);...申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数函数new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用函数完成空间中资源的清理。

14200

【C++干货基地】深度理解C++的高效内存管理方式 new & delete

所以我们看到了,在汇编代码中一个 push 的大小就是我们要开空间的字节 new[ ] 进行开辟连续的空间时我们就要注意了 本来申请个连续的空间难道不是40个字节嘛,为什么给我多开辟了4个字节...其实多出来的4个字节是为了在调用构造函数的时候记录需要构造的次数,已经的时候需要多少次。...记录数组的作用是为了给我们调用函数来用的 大家看一下下面的这段代码,使用 new[ ] 创建的空间不使用 deletet[ ] 释放空间居然不报错。...那么我们就行free的时候指针就是在开头的位置不要往前偏移才能释放 而我们一旦写了函数new[ ] 就会为我们多开 4个字节存放数量 五、 malloc/free和new/delete的区别...,new不需要,但是new需要捕获异常 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数函数new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用函数完成空间中资源的清理

22000

类和对象 _ 剖析构造、与拷贝

但是自定义类型的最终还是要对自定义类型的内置类型进行初始化,所以要在类创建的时候就做好处理。...当正确使用函数后就不用担心程序中有内存泄漏的情况了,因为在每次该对象生命周期结束后都会自动调用函数,流程如下: ①准备出生命周期 ②出生命周期,进入函数函数执行完毕,对象销毁...如何定义和使用拷贝构造函数 定义 浅拷贝 浅拷贝只是简单地复制对象的成员变量值,包括指针成员的地址,不是复制指针所指向的内容。...,因为形参为MyClass other不是MyClass& other,为什么出现这样的情况呢?...在函数创建了一个对象并进行返回,但是在函数结束后也就出了st的域,所以会调用Stack的函数对st进行,从而导致之前返回的那个值变为了后的结果,然后在返回的那个值出了它的域之后又会进行一次

9710

类和对象(

函数:与构造函数功能相反,函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用函数,完成对象中资源的清理工作。...Time类的对象,为什么最后会调用Time类的函数?...但是:main函数不能直接调用Time类的函数,实际要释放的是Date类对象,所以编译器会调用Date类的函数Date没有显式提供,则编译器会给Date类生成一个默认的函数,目的是在其内部调用...如果类没有申请资源时,函数可以不写,直接使用编译器生成的默认函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。 4....对于栈类来说,既然里面的_a包括地址也会完全拷贝,因此像这样的我们就需要自己写,要避免这种情况,我们就需要在st1 = st2过程重新让_a指向另一个地址,从而避免同一个地方两次,即free掉原空间

48800

《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

delete先调用函数,然后调用operator delete函数释放内存(通常底层使用free实现)。...假设基类采用的是非虚函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的函数不会调用派生类的函数。...77、构造函数函数可以调用虚函数吗,为什么 1) 在C++,提倡不在构造函数函数调用虚函数; 2) 构造函数函数调用虚函数时都不使用动态联编,如果在构造函数函数调用虚函数,...2) 用auto_ptr对象来取代指针类成员,便对构造函数做了强化,免除了抛出异常时发生资源泄漏的危机,不再需要在函数手动释放资源; 3) 如果控制权基于异常的因素离开函数此时正有另一个异常处于作用状态...但是对象a的空间还在呀(在之前),既然拷贝构造函数,实际上就是把a对象的内容复制一份到b,那么为什么我们不能直接使用a的空间呢?

2.3K40

C++内存分区模型分析与实例以及扩展

,而对于函数的 delete mp 来说,这样的影响是深远的,不知道什么时候就会带来 bug,且不可调试,只能通过“代码走查”的方式来检查是不是混用了两种类型的申请释放堆空间函数; return...C++ 编译器中都被支持; 2,free 在某些系统开发是不能调用; 3,delete 能够触发函数的调用; 4,free 仅归还之前分配的内存空间; 5,对象的销毁只能使用 delete...函数是否可以发生多态?...11,构造函数(构造函数调用虚函数)不可能发生多态行为: 1,在构造函数执行时,虚函数表指针未被正确初始化;12,函数函数调用虚函数)不可能发生多态行为: 1,在函数执行时,虚函数表指针可能已经被摧毁...;13,函数和构造函数(调用虚函数时)不能发生多态行为,只调用当前类函数版本; 1,构造函数函数调用虚函数实验:#include #include <string

76541
领券