我有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();
答案 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)
sprintf
就适合你。
sprintf(arr[0], " 1 - Use something\n");