MST

星途 面试题库

面试题:C++中delete操作与内存释放

在C++中,假设你有一个自定义类`MyClass`,并通过`new`操作符创建了一个`MyClass`对象的指针`MyClass* ptr = new MyClass();`。请阐述使用`delete ptr;`时,需要注意哪些要点来确保安全使用`delete`操作,并且说明如果不遵循这些要点可能会出现什么问题。
35.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 注意要点
    • 对象类型匹配:使用delete时,指针类型必须与new分配内存时创建的对象类型完全匹配。例如,如果new创建的是MyClass对象,delete的指针也必须是MyClass类型的指针,不能是基类指针(除非基类有虚析构函数,后面会提到)。
    • 虚析构函数:如果MyClass是一个基类,并且通过基类指针delete派生类对象,那么基类必须有虚析构函数。否则,派生类的析构函数不会被调用,可能导致资源泄漏。
    • 避免重复释放:确保不要对同一个指针多次调用delete。一旦调用delete释放了内存,指针所指向的内存已经无效,再次调用delete会导致未定义行为。可以在调用delete后将指针设置为nullptr,以防止意外的重复释放。例如:
    MyClass* ptr = new MyClass();
    delete ptr;
    ptr = nullptr;
    
  2. 不遵循要点可能出现的问题
    • 对象类型不匹配:如果delete的指针类型与new创建的对象类型不匹配,会导致未定义行为。例如,将派生类对象的指针赋值给基类指针,然后在基类没有虚析构函数的情况下使用基类指针delete,可能不会正确调用派生类的析构函数,从而导致派生类中分配的资源无法释放,造成资源泄漏。
    • 缺少虚析构函数:当通过基类指针delete派生类对象且基类没有虚析构函数时,只会调用基类的析构函数,派生类的析构函数不会被调用。这可能导致派生类中申请的动态资源(如动态分配的内存、文件句柄等)无法释放,引发资源泄漏。
    • 重复释放:对已经释放的指针再次调用delete会导致未定义行为。这可能会破坏堆内存的管理结构,导致程序崩溃,或者出现难以调试的逻辑错误。