打印2D数组时出现内存泄漏,我将数据从向量循环到称为网格的向量中
Grid中的某些索引为空,例如grid [8] [8]为空,但是grid [1] [1]的值为3。 当我显示带有空值的网格索引时,出现内存泄漏。
下面是我的代码,任何建议将不胜感激!
void populateAppendixB(vector<string> cityLocation, int **grid, int col, int row) {
vector<int> data = appendixB_data(cityLocation);
vector<string> appendixB_coordinates = getCoordinates(cityLocation);
vector<int> x_value = returncolValue(appendixB_coordinates);
vector<int> y_value = returnrowValue(appendixB_coordinates);
//loop data into grid[][]
for (int i = 0; i < x_value.size(); i++) {
grid[x_value[i]][y_value[i]] = data[i];
}
cout << " ";
//Top outer Grid
for (int i = 0; i < col + 2; i++) {
cout << " # ";
}
cout << " # ";
cout << endl;
//end
//y-axis
for (int j = row; j >= 0; --j) {
cout << " " << j << " # ";
for (int i = 0; i <= col; ++i) {
//displaying data
if(grid[i][j] == 0) {
cout << " ";
}
else {
cout << grid[i][j] << " ";
}
}
//Right outer Grid
cout << "#";
cout << endl;
}
//Last row of #
cout << " ";
for (int i = 0; i < col + 2; i++) {
cout << " # ";
}
cout << " # ";
cout << endl;
cout << " ";
//x-Axis
for (int i = 0; i <= col; i++) {
cout << i << " ";
}
cout << endl;
}
答案 0 :(得分:0)
您使用grid[x_value[i]][y_value[i]] = data[i];
,但不会填充所有grid
,因为您只填写了grid
每一列的一个值(您仅执行以下循环:{{1} }。除非传入的网格正确地预先填充了for (int i = 0; i < x_value.size(); i++) {
(不可能告诉您所提交的代码),否则这可能是未定义的行为。
即使它是预先填充的2d数组,当您打印0
的元素时,您也会从grid
和[0, cols]
进行迭代,这可能不是您想要的(迭代[0, rows]
列和cols+1
行。因此,至少最后一个值将访问可能无效的内存。
如先前的评论所述,最好使用rows+1
(例如,使用std::vector
时访问std::vector<std::vector<int>>
来访问利用C ++异常的元素,而不是访问不良的内存),或者甚至.at(i).at(j)
也更擅长干净地预防和捕获许多问题。如果您担心速度,那可能不算什么,可以通过例如通过引用传递,将内容包装在智能指针(如果适用)中,移动语义等。
答案 1 :(得分:0)
我通过将所有2D数组值设置为{}解决了我的问题,然后用我想要的值填充网格数组。
它解决了内存泄漏问题,但是我不确定这是否是一个好习惯。