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
相关产品推荐
相关产品推荐

