删除动态 2D 数组不起作用

Deleting dynamic 2D array won't work

本文关键字:不起作用 数组 2D 动态 删除      更新时间:2023-10-16

我有一个2D动态数组的问题。代码在这里:

//Inicialization
char** arr = new char* [size];
for(int i = 0; i < size; i++)
    arr[i] = new char[70];

它基本上是句子的数量,每个句子最多70个字符。好吧……我以前用过这种方法。然后我想把它定位——我也这么做了!

//Deleting
for(int i = 0; i < size; i++)
    delete [] arr[i];
delete [] arr;

这将在i = 0时崩溃:"表达:_BLOCK_TYPE_IS_VALID (pHead -> nBlockUse)"。

但正如我所说的-我在不同的项目中以这种方式使用它:

//Init
char** vety = new char* [pocVet];
for(int i = 0; i < pocVet; i++)
    vety[i] = new char[100];
//Something (again a few sentences).
//Deleting
for(int i = 0; i < pocVet; i++)
    delete [] vety[i];
delete [] vety;

我看了这里的每一个地方,都是一样的。怎么了?PS:在第二个例子中,它工作不介意不同的名字(在我的母语中)。

编辑:也许是因为数组的内容?但在第二种情况下(它起作用的地方),里面的句子也一样。我只是在里面有一堆问题,用户只选择动作,所以基本上它只是句子:

arr[0] = " 1 - Use somethingn";
arr[1] = " 2 - Use different thingn";
arr[2] = " 3 - etc...n";
arr[3] = " 4 - etcn";
arr[4] = " 5 - etcn";
arr[5] = " 6 - etcn";
arr[6] = " 7 - etcn";

我什么都不做…只有printf ();

将指针arr[0]重新赋值为指向字符串字面值。

arr[0] = " 1 - Use somethingn";

所以你泄漏了你分配的内存,然后你尝试在你没有分配的内存上调用delete[]

解决方案是不要自己弄乱原始指针,而是使用标准库来为您完成困难的工作。

std::vector<std::string> v;
v.emplace_back(" 1 - Use somethingn");
// Other sentences

sprintf应该为您工作,只要字符串文字的大小小于70。

sprintf(arr[0], " 1 - Use somethingn");