如何删除(免费)cpp中的多维结构内存?
How to delete (free) multi dimensional struct memory in cpp?
struct grid{
char symbol;
int row;
int col;
};
在主函数中:
grid** gr=new gr*[ROW]; //memory allocation
for(int i=0;i<ROW;i++){
gr[i]= new grid[COL];
}
我想从结构 gr 中删除特定(不是全部)符号。
例如
delete[] gr[i][j];
我试过了:
delete[] gr[i][j].symbol;
delete[] gr[i][j].row;
delete[] gr[i][j].col;
我也试过:
delete[] gr[i][j];
none 的工作。我读过我需要先删除内部元素然后删除结构本身,但我不想完全删除结构。如何仅删除部分二维结构数组?
你有一个参差不齐的数组。它是一个指针数组。每个指针依次指向一个元素数组。
该数据结构中不能单独删除元素;它们是按行长度打包在缓冲区中的值。
删除一行只是 delete[] gr[i]
,然后可能 gr[i]=nullptr
所以你会注意到它丢失了。
当然,使用 raw new/delete 在现代 C++ 中已经过时了;向量的向量,或指向数组缓冲区的唯一指针的向量,可能是一个更好的主意。
先了解一些基础知识:
要删除它,您需要执行相反的操作。
每次调用 new 都必须调用 delete。
grid** gr=new gr*[ROW]; //memory allocation
for(int i=0;i<ROW;i++){
gr[i]= new grid[COL];
}
反转这个:
for(int i=0;i<ROW;i++){
delete [] gr[i];
}
delete [] gr;
因此,这可以让您了解可以在哪些对象上调用 delete。您只能删除您通过新建创建的内容。
问题的答案
如果你想erase/remove一个项目,你必须手动复制它后面的所有元素space(或者你想定义擦除的语义)。
假设我想在 [1][5]
放宽项目。这意味着 [1][6]...[1][COL - 1]
中的项目必须全部向后移动一个 space 以填充您已删除的项目。没有专门的命令,您必须手动执行。
for(int loop = 6; loop < COL; ++loop) {
gr[1][loop - 1] = gr[1][loop];
}
// Note you have not reduced the size of the array.
// So the least element still remains available.
但是进行手动内存管理并不是一个好主意。这是学校项目练习的一部分吗?那么这很好,因为下一个 class 将自动执行此操作。
但是如果您是在实际代码中执行此操作,那么您应该查看 std::vector<>
struct grid{
char symbol;
int row;
int col;
};
在主函数中:
grid** gr=new gr*[ROW]; //memory allocation
for(int i=0;i<ROW;i++){
gr[i]= new grid[COL];
}
我想从结构 gr 中删除特定(不是全部)符号。 例如
delete[] gr[i][j];
我试过了:
delete[] gr[i][j].symbol;
delete[] gr[i][j].row;
delete[] gr[i][j].col;
我也试过:
delete[] gr[i][j];
none 的工作。我读过我需要先删除内部元素然后删除结构本身,但我不想完全删除结构。如何仅删除部分二维结构数组?
你有一个参差不齐的数组。它是一个指针数组。每个指针依次指向一个元素数组。
该数据结构中不能单独删除元素;它们是按行长度打包在缓冲区中的值。
删除一行只是 delete[] gr[i]
,然后可能 gr[i]=nullptr
所以你会注意到它丢失了。
当然,使用 raw new/delete 在现代 C++ 中已经过时了;向量的向量,或指向数组缓冲区的唯一指针的向量,可能是一个更好的主意。
先了解一些基础知识:
要删除它,您需要执行相反的操作。
每次调用 new 都必须调用 delete。
grid** gr=new gr*[ROW]; //memory allocation
for(int i=0;i<ROW;i++){
gr[i]= new grid[COL];
}
反转这个:
for(int i=0;i<ROW;i++){
delete [] gr[i];
}
delete [] gr;
因此,这可以让您了解可以在哪些对象上调用 delete。您只能删除您通过新建创建的内容。
问题的答案
如果你想erase/remove一个项目,你必须手动复制它后面的所有元素space(或者你想定义擦除的语义)。
假设我想在 [1][5]
放宽项目。这意味着 [1][6]...[1][COL - 1]
中的项目必须全部向后移动一个 space 以填充您已删除的项目。没有专门的命令,您必须手动执行。
for(int loop = 6; loop < COL; ++loop) {
gr[1][loop - 1] = gr[1][loop];
}
// Note you have not reduced the size of the array.
// So the least element still remains available.
但是进行手动内存管理并不是一个好主意。这是学校项目练习的一部分吗?那么这很好,因为下一个 class 将自动执行此操作。
但是如果您是在实际代码中执行此操作,那么您应该查看 std::vector<>