DAY10

发布时间:2023年12月20日

问题一:new与malloc的区别

1.从返回值上来看

new返回的地址是自动转换的

malloc返回的地址是需要强转的

2.从名称上

new是运算符,可以调用重载运算符函数(operator)进行重载

而malloc虽然是函数,但是参数固定不能进行函数重载

3.参数上来看

new是不需要传参的,它分配空间的大小由编译器根据类型计算得出

而malloc是需要传参的,传递的是具体开辟空间的大小的字节数

4.从底层在来看

new是先调用malloc函数,先在堆区中开辟,如果这段空间的类型是类的话,会调用构造函数,对对象里面的成员变量进行赋值

而malloc仅仅只是在堆区中开辟空间

5.从空间开辟失败的后果上来看

new开辟空间失败会抛出一段异常

而malloc会返回一个空指针

6.从已分配内存不够用扩张上来看

new不支持内存的扩张

malloc可以调用realloc扩张内存

问题二:delete和delete[]的区别

首先,delete是先调用析构函数,再调用free函数

要判断他俩的区别我们可以从析构函数上来看,我们都知道析构函数是释放成员变量所指向的堆区空间的,那么如果成员变量在堆区开辟了3个对象的空间的话,假设p是指针类型的成员变量,它指向了堆区中三个对象的第一个对象,那么如果是delete p的话,只会调用一次析构函数,而如果是delete【】就会调用三次析构函数

由此我们可以看出,delete很有可能没有释放干净我们开辟的堆区空间,造成堆区内存的泄露

问题三:野指针

如何产生?

1.定义指针变量的时候就没有进行初始化

2.一个指针变量指向的堆区空间被释放了,但是却忘记赋空

3.数组越界了

如果避免?

1.如果指针变量暂时没有初始化的值,就把它先变为空指针

2.记得释放完堆区空间之后,及时赋值为空

3.注意数组边界问题

文章来源:https://blog.csdn.net/m0_75178021/article/details/135116416
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。