如何在cpp中删除(免费)多维结构内存?

How to delete (free) multi dimensional struct memory in cpp?

本文关键字:结构 内存 免费 cpp 删除      更新时间:2023-10-16
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];

它都没有奏效。我已经读到我需要先删除内部元素,然后删除结构本身,但我不想完全删除结构。如何删除我的一些二维结构数组?

首先是一些基础知识:

要删除它,您需要做相反的事情。

对于每次调用 new,都必须有一个要删除的调用。

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;

因此,这可以让您了解可以调用删除的内容。 您只能删除通过 new 创建的内容。

问题解答

如果要擦除/删除项目,则必须手动将其后的所有元素复制回一个空格(或者要定义擦除的语义(。

假设我想在[1][5]放轻松项目。这意味着[1][6]...[1][COL - 1]处的项目必须全部向后移动一个空格,以填充已删除的项目。没有特殊的命令,您必须手动执行此操作。

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.

但是进行手动内存管理不是一个好主意。这是学校项目练习的一部分吗?那么这很好,因为下一个类将自动化这一点。

但是,如果您在实际代码中执行此操作,那么您应该查看std::vector<>

你有一个交错数组。 它是一个指针数组。 每个指针依次指向一个元素数组。

不能在此数据结构中单独删除元素;它们是打包在行长度的缓冲区中的值。

删除一行只是delete[] gr[i],然后可能gr[i]=nullptr,以便您可以注意到它丢失了。

当然,在现代C++中使用原始的new/delete是过时的;向量的向量,或者数组缓冲区的唯一ptrs向量,可能是一个更好的主意。