如何删除(免费)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<>