瓦尔格林德错误 - 地址0x0不是堆叠的 malloc'd 或自由的

Valgrind Error - Address 0x0 is not stack'd malloc'd or free'd

本文关键字:malloc 自由 林德 错误 0x0 地址      更新时间:2023-10-16

我正在尝试根据主行参数中声明的列数和行数分配内存。例如,a.out 2 4 6 表示运行 a.out 有 2 个玩家、4 列、6 行。

我希望内存与board_init函数一起分配,但 valgrind 返回: 读取大小 1 无效,user_input_players(整数,字符**( 并且堆已分配 0,释放 0,并且没有泄漏。

我只熟悉新命令和删除命令。我不确定如何理解错误消息。

// function declaration
int user_input_players(int choices, char** selection);
int user_input_columns(int choices, char** selection);
int user_input_rows(int choices, char** selection);
int board_init(int columns, int rows);

int main(int argc, char** argv) {
int column = 0, row = 0, player = 0;
player = user_input_players(argc, argv);
column = user_input_columns(argc, argv);
row = user_input_rows(argc, argv);
board_init(column, row);
return 0;
}
int user_input_players(int choices, char** selection){
int player_count = 0;
for(int i = 0; i < choices; i++){
selection[i];
}
while( !(*selection[1] == '1' || *selection[1] == '2')){
cout << "Please enter number of players: " << endl;
cin.clear();
cin >> player_count;
if(player_count == 1 || player_count == 2){
return player_count;
}
player_count = *selection[1];
return player_count;
}
}
int user_input_columns(int choices, char** selection){
int column_count = 0;
for(int i = 0; i < choices; i++){
selection[i];
}
column_count = atoi(selection[2]);
if(column_count >= 4 && column_count <= 20){
return column_count;
}
while( !(column_count >= 4 && column_count <= 20)){
cout << "Please enter number of columns: " << endl;
cin.clear();
cin >> column_count;
if(column_count >= 4 && column_count <= 20){
return column_count;
}
}
}
int user_input_rows(int choices, char** selection){
int row_count = 0;
for(int i = 0; i < choices; i++){
selection[i];
}
row_count = atoi(selection[3]);
if(row_count >= 4 && row_count <= 20){
return row_count;
}
while( !(row_count >= 4 && row_count <= 20)){
cout << "Please enter number of rows: " << endl;
cin.clear();
cin >> row_count;
if(row_count >= 4 && row_count <= 20){
return row_count;
}
}
}
void board_init(int columns, int rows){  // Valgrind shows no memory allocation because of error
int** board = new int*[rows];
for(int i = 0; i < rows; i++){
board[i] = new int[columns];
}
}

如果允许您使用矢量,请将init_board函数更改为使用 2d 矢量:

vector<vector<int> > vec( row , vector<int> (column));  

这将防止正在发生的内存泄漏。您还应该考虑直接在 main 中执行此操作。或者,如果你想保持函数的原样,你应该考虑从你的函数返回int**并将其存储在 main 中的int**变量中,以便以后可以删除它。当前您有内存泄漏,因为您永远不会删除在board_init中分配的内存。