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。该怎么做才能只删除我的二维结构数组中的一些?
答案 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的向量,可能是一个更好的主意。