欢迎关注本公众号,专注面试题拆解
分享一套视频课程《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[]是操作多个对象,但是这里它只调用一个对象的析构就可以了。但是实际代码实践和我想的有点不一样。
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混用
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上运行:崩溃
A
A
A
A
A
~A
Segmentation fault (core dumped)
使用delete释放数组,程序会发生崩溃。
总结:
不当使用 delete 和 delete[] 释放会导致未定义行为。未定义行为意味着编译器和运行时环境可以有不同的表现,具体结果可能包括:
内存损坏:可能会导致内存损坏或数据覆盖。
程序崩溃:程序可能会崩溃或表现出不可预测的行为。
资源泄露:如果类中有资源需要释放(如文件句柄、网络连接等),这些资源可能不会被正确释放。
两者的区别就是delete调用一次析构函数,delete[]会调用数组每个成员的析构函数。
今日送书福利
腾讯AI产品架构师带你轻松玩转大模型开发与应用,手把手教你演练使用TensorFlow和PyTorch开发大模型程序的方法和流程。
我的第1本AI游戏美术设计教程:从零开始学,成为AI游戏美术设计大师,突破传统设计理念,巧用AI工具高效搞定游戏美术设计!
留言赠书参与方法 :评论区留言
兑奖截止时间:2024年11月7日 16:00 整
end
CppPlayer
关注,回复【电子书】珍藏CPP电子书资料赠送
精彩文章合集
专题推荐