MST

星途 面试题库

面试题:C++ 复杂继承结构下动态内存分配的优化策略

考虑一个多层继承结构,`Base` 是最顶层基类,`Derived1` 继承自 `Base`,`Derived2` 继承自 `Derived1`,以此类推,直到 `DerivedN`。每个类都有动态分配的内存。描述一种优化策略,使得在对象创建和销毁过程中,动态内存分配和释放的开销最小化,同时保证继承体系的正确性和多态行为的正常工作。并通过代码示例展示这种策略的实现。
45.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

优化策略

  1. 使用智能指针:在C++ 中,使用智能指针(如 std::unique_ptrstd::shared_ptr)来管理动态分配的内存。智能指针可以自动处理内存的释放,避免手动释放内存带来的错误,如内存泄漏和悬空指针。
  2. 虚析构函数:在基类 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;
}

在上述代码中:

  1. Base 类有一个虚析构函数,确保在通过 Base 指针删除派生类对象时,能正确调用派生类的析构函数。
  2. Derived1Derived2 类使用 std::unique_ptr 来管理动态分配的 int 类型数据。
  3. main 函数中,通过 std::make_unique 创建 Derived2 对象,并将其存储在 std::unique_ptr<Base> 中,展示了多态行为。当 basePtr 超出作用域时,会自动释放所有动态分配的内存。