面试题答案
一键面试优化策略
- 使用智能指针:在C++ 中,使用智能指针(如
std::unique_ptr
或std::shared_ptr
)来管理动态分配的内存。智能指针可以自动处理内存的释放,避免手动释放内存带来的错误,如内存泄漏和悬空指针。 - 虚析构函数:在基类
Base
中定义一个虚析构函数。这样,当通过基类指针删除派生类对象时,会调用正确的派生类析构函数,从而确保所有层次的动态分配内存都能正确释放。
代码示例
#include <memory>
#include <iostream>
class Base {
public:
virtual ~Base() = default; // 虚析构函数
virtual void print() const {
std::cout << "Base" << std::endl;
}
};
class Derived1 : public Base {
public:
Derived1() : data(std::make_unique<int>(1)) {}
void print() const override {
std::cout << "Derived1: " << *data << std::endl;
}
private:
std::unique_ptr<int> data;
};
class Derived2 : public Derived1 {
public:
Derived2() : moreData(std::make_unique<int>(2)) {}
void print() const override {
std::cout << "Derived2: " << *moreData << std::endl;
Derived1::print();
}
private:
std::unique_ptr<int> moreData;
};
int main() {
std::unique_ptr<Base> basePtr = std::make_unique<Derived2>();
basePtr->print();
// 当basePtr超出作用域时,Derived2、Derived1和Base的析构函数会按顺序自动调用,释放动态分配的内存
return 0;
}
在上述代码中:
Base
类有一个虚析构函数,确保在通过Base
指针删除派生类对象时,能正确调用派生类的析构函数。Derived1
和Derived2
类使用std::unique_ptr
来管理动态分配的int
类型数据。- 在
main
函数中,通过std::make_unique
创建Derived2
对象,并将其存储在std::unique_ptr<Base>
中,展示了多态行为。当basePtr
超出作用域时,会自动释放所有动态分配的内存。