MST

星途 面试题库

面试题:C++中如何避免数组越界和指针悬挂综合场景

假设有一个场景,你正在开发一个图形渲染引擎中的物体管理模块。有一个类`ObjectManager`,它内部使用数组存储物体对象指针。在物体添加和删除过程中,既要保证不会出现数组越界访问,又要防止指针悬挂。请你设计`ObjectManager`类的关键成员函数(如添加物体`addObject`、删除物体`removeObject`),并解释你的设计如何避免数组越界和指针悬挂问题。
16.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <vector>

class Object {
    // 物体类的具体实现,这里省略具体细节
};

class ObjectManager {
private:
    std::vector<Object*> objects;

public:
    void addObject(Object* obj) {
        if (obj) {
            objects.push_back(obj);
        }
    }

    void removeObject(Object* obj) {
        for (auto it = objects.begin(); it != objects.end(); ++it) {
            if (*it == obj) {
                delete *it;
                objects.erase(it);
                break;
            }
        }
    }

    ~ObjectManager() {
        for (Object* obj : objects) {
            delete obj;
        }
        objects.clear();
    }
};

避免数组越界的设计

  1. addObject函数:在addObject函数中,通过objects.push_back(obj)将物体指针添加到std::vector中。std::vector会自动管理内存并根据需要动态扩展,因此不会出现数组越界的情况。
  2. removeObject函数:使用for循环和erase成员函数来删除指定物体指针。在erase操作后,std::vector会自动调整其大小,并且erase操作会移动后续元素,保证不会访问到越界位置。
  3. 析构函数:在析构函数中,遍历objects容器,释放每个物体的内存,并调用clear方法清空容器,这一过程不会发生越界访问。

避免指针悬挂的设计

  1. removeObject函数:在删除物体指针时,先使用delete释放该指针指向的内存,然后从objects容器中移除该指针。这样,后续不会有指向已释放内存的悬挂指针。
  2. 析构函数:析构函数会遍历objects容器,释放所有物体的内存并清空容器,确保在ObjectManager对象销毁时,不存在悬挂指针。