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