MST

星途 面试题库

面试题:C++中delete与delete []在内存管理及构造析构函数调用上的深入区别

考虑以下代码片段:`class Resource { public: Resource() { std::cout << "Resource constructor" << std::endl; } ~Resource() { std::cout << "Resource destructor" << std::endl; } };`,`Resource* ptr1 = new Resource;`,`Resource* ptr2 = new Resource[5];`。如果错误地使用`delete ptr2;`和正确使用`delete [] ptr2;`,以及正确使用`delete ptr1;`,分别分析内存释放过程中构造函数和析构函数的调用情况以及可能导致的内存问题。
43.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. delete ptr2;
    • 构造函数调用情况:已经调用了Resource类默认构造函数6次(1次为ptr1指向的对象,5次为ptr2指向的数组中的对象)。
    • 析构函数调用情况:只调用1次Resource类的析构函数,因为delete没有和new[]匹配使用,它只会销毁ptr2指向的数组的第一个对象。
    • 可能导致的内存问题:内存泄漏。数组中剩余4个对象的内存没有被释放,因为它们的析构函数没有被调用,这部分内存无法再被程序使用,造成了内存浪费。
  2. delete [] ptr2;
    • 构造函数调用情况:同上述,已经调用了Resource类默认构造函数6次(1次为ptr1指向的对象,5次为ptr2指向的数组中的对象)。
    • 析构函数调用情况:调用5次Resource类的析构函数,因为delete []会遍历数组,依次调用每个对象的析构函数,将ptr2指向的数组中的5个对象都正确销毁。
    • 可能导致的内存问题:无内存问题,内存正确释放,所有对象的析构函数都被调用,分配的内存被正确回收。
  3. delete ptr1;
    • 构造函数调用情况:已经调用了Resource类默认构造函数1次(为ptr1指向的对象)。
    • 析构函数调用情况:调用1次Resource类的析构函数,deletenew匹配使用,正确销毁ptr1指向的对象。
    • 可能导致的内存问题:无内存问题,内存正确释放,对象的析构函数被调用,分配的内存被正确回收。