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

C++类构造函数中初始化未知尺寸二维数组的问题咨询

报错原因

你写的new int[rows][2]返回的类型是int (*)[2](指向包含2个int元素的数组的指针),和你类成员定义的int** matrix(指向int指针的指针)类型不匹配,所以编译报错。另外你当前代码还有两处严重问题:

  • 给visited[size]赋值时size还未初始化,属于未定义行为
  • visited指针没有先申请内存就直接访问,会触发非法内存访问崩溃

正确的初始化方案

方案1:保持int** matrix定义,分步骤申请内存

你可以先申请rows个int指针,再逐个给每个指针申请长度为2的int数组:

Digraph::Digraph(int n) : size(n), edges(0) {
    int rows = n * (n - 1) / 2;
    // 初始化matrix
    matrix = new int*[rows];
    for (int i = 0; i < rows; ++i) {
        matrix[i] = new int[2];
        // 按需求给元素初始化默认值
        matrix[i][0] = 0;
        matrix[i][1] = 0;
    }
    // 初始化visited
    visited = new bool[size];
    for (int i = 0; i < size; ++i) {
        visited[i] = false;
    }
}

注意:你需要配套实现析构函数释放内存,避免内存泄漏,析构函数写法如下:

Digraph::~Digraph() {
    int rows = size * (size - 1) / 2;
    for (int i = 0; i < rows; ++i) {
        delete[] matrix[i];
    }
    delete[] matrix;
    delete[] visited;
}

方案2:调整matrix定义简化操作(最优方案)

因为第二维固定是2,你可以直接把matrix的定义改成int (*matrix)[2],和new返回的类型匹配,不需要循环申请内存,性能比方案1更高。
首先修改头文件私有成员:

private:
    int size;
    bool* visited;
    int edges;
    int (*matrix)[2]; // 替换原来的int** matrix

构造函数可以简化为:

Digraph::Digraph(int n) : size(n), edges(0) {
    int rows = n * (n - 1) / 2;
    matrix = new int[rows][2];
    // 按需求给元素初始化默认值
    for (int i = 0; i < rows; ++i) {
        matrix[i][0] = 0;
        matrix[i][1] = 0;
    }
    // 初始化visited
    visited = new bool[size];
    for (int i = 0; i < size; ++i) {
        visited[i] = false;
    }
}

对应的析构函数也更简单:

Digraph::~Digraph() {
    delete[] matrix;
    delete[] visited;
}

内容的提问来源于stack exchange,提问作者Flip The Ewok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:15:03