面试题:对于数组和非数组的delete有什么区别?——北方华创面试题

旅行   2024-10-30 07:45   广东  

欢迎关注本公众号,专注面试题拆解

分享一套视频课程《C++百万并发服务器开发》,有需要的加我微信获取:fb964919126

文末赠书

面试题:对于数组和非数组的delete有什么区别?

这是一道今年的校招题目,老实说看到这个题目,对于delete和delete[],我觉得都不能算考点,这么问我觉得后面大概率接着会问,如果发生了混用会出现什么结果

第一点:对于内建的普通数据类型,delete和delete[] 没有区别

int main() {    {        int* p = new int(5);        delete p;    }    {        int* p = new int;        delete[] p;    }    getchar();    return 0;}

上面代码是可行的,编译器不会报错,但是不推荐这么写。

第二点:对于自定义的复杂类型,delete和delete[]不能互用

delete 用于释放单个对象的内存。当使用 new 分配一个单一对象的内存时,应当使用 delete 来释放它。delete只会调用一次析构函数。

delete[] 用于释放数组的内存。当使用 new[] 分配一个数组的内存时,应当使用 delete[] 来释放它。delete[]会调用每一个成员的析构函数。

混用会出现什么问题?

第一:new 和delete[]混用

开始我想当然的认为编译应该能通过,new只是一个对象,delete[]是操作多个对象,但是这里它只调用一个对象的析构就可以了。但是实际代码实践和我想的有点不一样。

#include <iostream>
class A{public: A() { std::cout << "A" << std::endl;    } ~A() { std::cout << "~A" << std::endl; }};int main() { { A* p = new A(); delete[] p;    }
getchar(); return 0;}

然后我在Windows上运行这段代码,会陷入调用析构函数的死循环。

然后又到linux下运行:运行一会后崩溃

使用 delete[] 释放单个对象的内存,内存被损坏,会导致未定义行为

第二:new 数组和delete混用

#include <iostream>class A{public:    A()    {        std::cout << "A" << std::endl;    }    ~A()    {        std::cout << "~A" << std::endl;    }};int main() {    {        A* array = new A[5];        delete array;    }    getchar();    return 0;}

在Windows上运行直接崩溃:

在linux上运行:崩溃

AAAAA~ASegmentation fault (core dumped)

使用delete释放数组,程序会发生崩溃。

总结:

不当使用 delete 和 delete[] 释放会导致未定义行为。未定义行为意味着编译器和运行时环境可以有不同的表现,具体结果可能包括:

内存损坏:可能会导致内存损坏或数据覆盖。

程序崩溃:程序可能会崩溃或表现出不可预测的行为。

资源泄露:如果类中有资源需要释放(如文件句柄、网络连接等),这些资源可能不会被正确释放。

两者的区别就是delete调用一次析构函数,delete[]会调用数组每个成员的析构函数。


今日送书福利

腾讯AI产品架构师带你轻松玩转大模型开发与应用,手把手教你演练使用TensorFlow和PyTorch开发大模型程序的方法和流程。

我的第1本AI游戏美术设计教程:从零开始学,成为AI游戏美术设计大师,突破传统设计理念,巧用AI工具高效搞定游戏美术设计!

留言赠书参与方法 :评论区留言

活动截止时间:2024年11月6日 16:00 整

兑奖截止时间:2024年11月7日 16:00 整

end



CppPlayer 



关注,回复【电子书】珍藏CPP电子书资料赠送

精彩文章合集

专题推荐

【专辑】计算机网络真题拆解
【专辑】大厂最新真题
【专辑】C/C++面试真题拆解

CppPlayer
一个专注面试题拆解的公众号
 最新文章