首页 > 编程知识 正文

delete单三形式,free和new

时间:2023-05-05 06:23:05 阅读:146333 作者:1773

1 .首先,在c中分配和释放new和delete堆内存由new和delete操作,并讨论c语言在malloc和free之间的区别。

)1) new的基础也在用malloc开拓内存,但new比malloc具有更多的功能,也可以在开拓内存后进行初始化操作。

int*p=newint(8; 以上是new的基本操作,8表示在堆中打开的整形内存的初始值; 对于自定义类类型。

测试* p=new test (; //Test是一个预定义的类,该new语句在堆中打开Test大小的内存后,调用Test类的缺省构造函数来构建对象的malloc智能一次可以占用一定大小的内存空间来进行结构初始化操作

) delete比free有更多功能,new和delete可以成对使用,可以在释放内存之前分解指针指向的对象,而new[]和delete[]成对使用,尽量不相交。 虽然有时会正常工作,但代码标记不正确,容易引起潜在的风险。

)3) new的内存打开失败是抛出bad_alloc类型的异常,因此需要在代码中捕获该类型的异常才能正确确定堆内存是否被成功分配。 malloc内存开拓失败返回的是空指针。

)4) new和delete不仅仅是运算符,实际上是运算符重载函数的调用,对应的函数名是operator new和operator delete。 在全局或类的范围中,可以使用自定义new和delete运算符重载函数来修改默认的malloc和free内存释放行为,如内存池实现。

)5)申请数组时,new[]一次性分配所有内存,多次调用构造函数,delete[ ],delete[ ]组合多次调用析构函数,销毁数组中的每个对象。 malloc只能做sizeof(int ) * n。

)6) new返回指向指定对象的指针,malloc返回void,所以malloc的返回值一般需要类型转换

在new[]上申请的内存什么时候可以在delete上释放? new和new[]的下层由malloc释放内存,而delete和delete[]的下层由free释放内存。 那么,为什么在c中将各个要素的内存释放和数组的内存释放分开呢? 因为在c中,打开内存和结构对象一起发生,分解结构对象和释放内存一起发生。

int *p=new int; delete p; int *p=new int; delete []p; int *p=new int[10]; delete []p; int *p=new int[10]; delete p; 查看上面的示例代码,对于嵌入式,可以这样混合。 对于嵌入式,没有构建或析构函数,因此这里的内存管理和malloc、free调用的含义相同,没有问题。 但是,在实际编码中不要这么写。 毕竟不是好的编码规格。

对于以下类类型:

classtest { public : test (} { } private : intma; (; test * p=新测试; delete p; test * p=新测试; delete []p; Test *p=new Test[10]; delete []p; Test *p=new Test[10]; delete p; 上述四个代码也没有任何问题。 因为这个类不提供析构函数。 这意味着a类对象不需要执行有效的析构函数。 那么,delete只需要完成free的功能。 那么,什么时候必须配对使用呢? 看看下面的Test类型。

classtest { public : test ((}~test ) ) {}private: int ma; (; test * p=新测试; delete p; //正确的测试* p=new test; delete []p; //错误报告Test *p=new Test[10]; delete []p; //正确的Test *p=new Test[10]; delete p; //这个Test系和上面的有什么不同之处吗? 当然,此时会有自定义的析构函数。 现在,让我们分析一下new和delete的具体操作是如何进行的。

test * p=新测试; delete []p; 为内存开发了4字节的内存,如下所示。

但是奇怪的花卷是delete[]p; 的时候,它从哪里释放了内存? 请看照片:

为什么要减少4个字节开始释放内存呢? 因为定义了析构函数,所以在释放内存之前必须在内存中析构对象。 写delete[]p时,编译器认为这里会析构很多对象。 多少个对象? 记录对象个数的数字存储在对象存储器上方的4字节中,因此从中释放存储器。

Test *p=new Test[10]; delete p; 这个错误的原因可以根据以上的说明自己分析。

因此,在自定义类类型并提供析构函数时,new和delete绝对不能混淆,对象的析构函数和内存释放存在问题,而且new和delete在逻辑上可以混用,但最好不要这样做这样的代码没有人喜欢看,危险性很高

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。