我有一个使用以下char**
char** Names=new char* [1000]
for (int j=0;j<1000;j++){Names[j]=new char [100];}
在析构函数中,我确保Names[j]
的{{1}}指向某个字符串:
j=0
输出为:~Myclass()
{
cout<<"Name is: "<<Names[0]<<endl;
}
但是Names is: Alex
析构函数中的delete
会出错:
Names[0]
以下是我得到的错误输出的一部分:
~Myclass()
{
cout<<"Name is: "<<Names[0]<<endl;
delete[] Names[0];
}
答案 0 :(得分:4)
这看起来像堆错误。根据您看到的错误消息类型,我怀疑Names [0]上的指针指向字符串&#34; Alex&#34;它位于静态记忆中。
在您的计划的某个地方,您可能已经完成了:
Names[0] = "Alex";
在这种情况下字符串&#34; Alex&#34;在静态记忆中。所以当你打电话时:
delete [] Names[0];
你说&#34;删除静态内存中的东西&#34;,这会导致你看到的运行时堆错误。要实现的重点是运算符new
和delete
仅适用于堆内存。
如果你做了类似的事情:
strcpy(Names[0], "Alex");
你不会得到你看到的运行时堆错误。
答案 1 :(得分:1)
使用new[]
创建数组时,您需要使用delete[]
。
对于你的Names阵列,破坏应该是这样的:
for (int j=0;j<1000;j++)
delete[] Names[j];
delete[] Names;