You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:44:37