MST

星途 面试题库

面试题:C++中delete与delete []误用的常见场景及后果

请举例说明在C++中delete与delete []可能出现误用的常见场景,并阐述误用后可能导致的后果。
16.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 常见误用场景
    • 场景一:对单个对象使用delete []
      • 例如:
int* singleInt = new int(5);
delete [] singleInt;
 - 在这段代码中,`singleInt`是通过`new int`创建的单个`int`对象,应该使用`delete singleInt;`来释放内存。然而却错误地使用了`delete []`。
  • 场景二:对数组对象使用delete
    • 例如:
int* intArray = new int[10];
delete intArray;
 - 这里`intArray`是通过`new int[10]`创建的包含10个`int`的数组,正确的释放方式是`delete [] intArray;`,但错误地使用了`delete`。

2. 误用后果

  • 对单个对象使用delete []
    • 后果可能是程序行为未定义。delete []操作符会试图按照数组的方式来释放内存,它可能会尝试调用数组中每个元素的析构函数(即使这里只有一个对象),这可能导致额外的、不必要的析构函数调用,并且可能会以错误的方式处理内存,最终可能导致程序崩溃或产生其他难以调试的错误。
  • 对数组对象使用delete
    • 这同样会导致程序行为未定义。delete操作符只会调用数组首元素的析构函数(如果对象类型有析构函数),而不会调用数组中其他元素的析构函数,这会导致内存泄漏,因为数组中除首元素外的其他对象占用的内存没有被正确释放,同时可能也会导致堆内存管理混乱,引发程序崩溃或其他异常行为。