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

时间:2016-11-09 14:29:55

标签: c++

我有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-&gt; 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 something\n";
arr[1] = " 2 - Use different thing\n";
arr[2] = " 3 - etc...\n";
arr[3] = " 4 - etc\n";
arr[4] = " 5 - etc\n";
arr[5] = " 6 - etc\n";
arr[6] = " 7 - etc\n";

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

2 个答案:

答案 0 :(得分:4)

您重新指定指针arr[0]以指向字符串文字。

arr[0] = " 1 - Use something\n";

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

解决方案是不要自己搞乱原始指针,而是使用标准库为你做困难的工作。

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

答案 1 :(得分:1)

只要字符串文字的大小小于70,

sprintf就适合你。

sprintf(arr[0], " 1 - Use something\n");