bosthhe1 / cpushpush

0 stars 0 forks source link

对于new,delete和malloc,free的比对 #12

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago

首先我们要知道:new和delete是操作符,malloc和free是函数 new和delete只能用于在堆上面开辟空间,不能用于在栈上开辟空间 new和malloc对于内置类型效果大致一样,但是nwe后面可以直接初始化 delete和free对于内置类型效果一样 但是对于自定义类型他们就有很大的区别 new对于自定义类型会先开辟一个空间,然后调用自定义类型的构造函数,进行初始化 delete对于自定义类型会去调用自定义类型的析构函数,内部释放完后,然后再释放外部

bosthhe1 commented 1 year ago

new和malloc最大的区别就在于 new在开辟空间失败的时候会抛返回值,而malloc是直接制空,所以malloc一般我们会判空,然后结束掉程序,但是对于new,在new空间开辟失败的情况下,如果没有catch,会直接终止程序,把异常打印到屏幕上,如果有catch,就会捕捉到异常,直接跳转到异常处,new后面语句就不会执行了,然后继续执行catch后面的程序 _XQB1G@1}M_LTJS$3 7X(TW 需要注意的是,new必须在try的内部被执行,才能被catch捕捉

bosthhe1 commented 1 year ago

new的结构图(走前序的顺序),先开空间,后调用构造函数初始化 image

bosthhe1 commented 1 year ago

delete的结构图(走的前序的顺序),点调用析构函数,释放内部空间,后释放外部 image

bosthhe1 commented 1 year ago

我们在使用new,delete的时候,必须对应起来,new和delete对应,new[]和delete[]对应,对于内置类型,new[],和detele混合使用,虽然不会造成问题,但是不建议这样用,对于自定义类型如果混合使用就容易造成程序崩溃 image