如何在C++中实现动态分配数组的扩容?
动态扩容存储ComplexNumber指针数组的完整实现
嘿,我来帮你补全并优化这段动态扩容的代码,顺便梳理下容易踩坑的点:
首先,先放上完整可运行的代码,补全你没写完的部分,同时修正了几个容易出错的细节:
#include <iostream> #include <algorithm> #include <limits> // 用于std::numeric_limits // 先定义ComplexNumber类(假设你已有这个类,这里补全基础实现) class ComplexNumber { private: double realPart; double imagPart; public: ComplexNumber(double real, double imag) : realPart(real), imagPart(imag) {} // 方便测试的打印方法 void display() const { std::cout << realPart; if (imagPart >= 0) std::cout << " + "; else std::cout << " - "; std::cout << std::abs(imagPart) << "i" << std::endl; } }; int main() { int brojUnesenih = 0; // 必须初始化计数器,不然会访问非法内存 ComplexNumber** nizKompl = new ComplexNumber*[1]; // 初始容量为1的指针数组 bool unos = true; double re, im; // 存储输入的实部和虚部 while (unos) { std::cout << "Unesite novi kompleksni broj(realni imaginarni): "; if (std::cin >> re >> im) { // 把新创建的ComplexNumber对象存入数组 nizKompl[brojUnesenih] = new ComplexNumber(re, im); brojUnesenih++; // 开始扩容:创建更大的临时数组 ComplexNumber** nizTemp = new ComplexNumber*[brojUnesenih + 1]; // 复制旧数组里的所有指针到新数组 std::copy(nizKompl, nizKompl + brojUnesenih, nizTemp); // 释放旧的指针数组(注意:这里只释放数组本身,不释放里面的ComplexNumber对象) delete[] nizKompl; // 将主数组指针切换到新数组 nizKompl = nizTemp; } else { // 输入失败(比如用户输入了非数字),终止循环 std::cout << "\nUnos zavrsen!" << std::endl; unos = false; // 清除输入流的错误状态,避免后续操作出问题 std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } } // 打印所有输入的复数,验证结果 std::cout << "\nSvi uneseni kompleksni brojevi:" << std::endl; for (int i = 0; i < brojUnesenih; i++) { nizKompl[i]->display(); } // 非常重要:清理内存,避免泄漏 // 先逐个释放每个ComplexNumber对象 for (int i = 0; i < brojUnesenih; i++) { delete nizKompl[i]; } // 再释放存储指针的数组 delete[] nizKompl; return 0; }
关键注意事项:
- 计数器初始化:
brojUnesenih一定要初始化为0,否则一开始就会访问数组的未知索引,触发未定义行为。 - 扩容后的内存释放:每次创建新数组后,必须用
delete[]释放旧数组的内存,不然会造成内存泄漏。 - 输入错误处理:当用户输入无效内容时,
cin会进入错误状态,必须用clear()清除错误标记,并用ignore()跳过错误输入,否则循环会无限执行。 - 内存清理顺序:要先释放数组里的每个
ComplexNumber对象,再释放存储指针的数组,反过来会导致无法访问对象指针,造成内存泄漏。 - 效率优化建议:当前每次扩容只增加1个容量,频繁输入时会多次触发内存分配和复制,效率较低。可以改成按倍数扩容(比如每次容量翻倍),比如初始容量设为2,扩容时新容量是旧容量的2倍,能大幅减少分配次数。
内容的提问来源于stack exchange,提问作者Adnan Selimovic
相关产品推荐
相关产品推荐

