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

时间:2018-10-15 19:24:08

标签: c++ dynamic-memory-allocation

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];

没有一个工作。我已经读到我需要先删除内部元素,然后再删除struct本身,但我不想完全删除struct。该怎么做才能只删除我的二维结构数组中的一些?

2 个答案:

答案 0 :(得分:2)

一些基本知识:

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

对于每次调用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;

因此,这使您对可以调用delete的想法有所了解。您只能删除通过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<>

答案 1 :(得分:1)

您有一个锯齿状的数组。它是一个指针数组。每个指针依次指向一个元素数组。

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

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

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