char字符串与cout一起使用,但析构函数会出错

时间:2016-12-28 06:25:40

标签: c++ string memory char

我有一个使用以下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];
}

2 个答案:

答案 0 :(得分:4)

这看起来像堆错误。根据您看到的错误消息类型,我怀疑Names [0]上的指针指向字符串&#34; Alex&#34;它位于静态记忆中。

在您的计划的某个地方,您可能已经完成了:

Names[0] = "Alex";

在这种情况下字符串&#34; Alex&#34;在静态记忆中。所以当你打电话时:

delete [] Names[0];

你说&#34;删除静态内存中的东西&#34;,这会导致你看到的运行时堆错误。要实现的重点是运算符newdelete仅适用于堆内存。

如果你做了类似的事情:

strcpy(Names[0], "Alex");

你不会得到你看到的运行时堆错误。

答案 1 :(得分:1)

使用new[]创建数组时,您需要使用delete[]

对于你的Names阵列,破坏应该是这样的:

for (int j=0;j<1000;j++)
 delete[] Names[j];
delete[] Names;