C++中如何调整存储自定义对象的动态数组的大小
C++ 手动实现动态指针数组扩容插入员工的方案
核心实现逻辑
- 提前维护两个配套变量:
int current_size记录当前已存入的员工数量,int capacity记录数组当前的最大容纳量,初始插入第一名员工后,current_size = 1,capacity = 1 - 插入新员工前先判断是否需要扩容:如果
current_size == capacity,就触发扩容逻辑 - 扩容时先申请容量为原容量2倍的新指针数组,避免频繁申请内存造成性能损耗
- 将旧数组的所有指针元素逐位拷贝到新数组
- 释放旧数组的内存(注意只释放数组本身,不要释放内部的Worker对象指针,避免后续访问失效)
- 将原数组指针指向新数组,更新
capacity为新的容量值 - 把新员工指针存入数组尾部,更新
current_size
完整代码示例
// 初始状态为插入第一名员工后的值 Worker** list_of_workers = new Worker*[1]; list_of_workers[0] = new Worker(name, id, seniority); int current_size = 1; int capacity = 1; // 插入新员工的逻辑 void insert_worker(const std::string& name, int id, int seniority) { // 触发扩容逻辑 if (current_size == capacity) { // 扩容为原容量的2倍 int new_capacity = capacity * 2; Worker** new_list = new Worker*[new_capacity]; // 拷贝旧元素到新数组 for (int i = 0; i < current_size; i++) { new_list[i] = list_of_workers[i]; } // 释放旧数组的内存 delete[] list_of_workers; // 更新指针和容量 list_of_workers = new_list; capacity = new_capacity; } // 插入新员工 list_of_workers[current_size] = new Worker(name, id, seniority); current_size++; }
注意事项
- 程序退出前要遍历数组逐个释放所有
Worker对象,再释放list_of_workers数组本身,避免内存泄漏 - 如果不是课程要求手动实现动态数组,优先使用STL提供的
std::vector<Worker*>或者std::vector<std::unique_ptr<Worker>>,不需要手动处理扩容逻辑,更安全不易出错
内容的提问来源于stack exchange,提问作者Hen Simkin
相关产品推荐
相关产品推荐

