面试题答案
一键面试- 内存泄漏:
- 当父类中有动态分配的内存时,如果子类析构函数不调用父类析构函数,父类中动态分配的内存将无法被释放。因为父类中负责释放动态内存的代码在父类析构函数中,不调用父类析构函数,这块内存就一直处于占用状态,从而导致内存泄漏。
- 示例代码如下:
#include <iostream>
class Parent {
public:
Parent() {
data = new int[10];
std::cout << "Parent constructor: Memory allocated for data\n";
}
~Parent() {
delete[] data;
std::cout << "Parent destructor: Memory deallocated for data\n";
}
private:
int* data;
};
class Child : public Parent {
public:
~Child() {
// 没有调用父类析构函数,会导致内存泄漏
std::cout << "Child destructor\n";
}
};
int main() {
Child* childObj = new Child();
delete childObj;
return 0;
}
在上述代码中,Child
类的析构函数没有调用Parent
类的析构函数,Parent
类中动态分配的int
数组data
所占用的内存无法释放,造成内存泄漏。运行程序时,只会看到“Child destructor”输出,而不会看到“Parent destructor: Memory deallocated for data”输出。
- 资源未正确清理:除了内存泄漏外,父类中可能还管理其他资源(如文件句柄、网络连接等),如果子类析构函数不调用父类析构函数,这些资源也无法得到正确清理,可能导致资源占用和系统资源耗尽等问题。虽然示例中以内存为例,但原理同样适用于其他资源类型。