C++ char字符串与cout一起工作,但析构函数给出错误

C++ char字符串与cout一起工作,但析构函数给出错误,c++,string,memory,char,C++,String,Memory,Char,我有一个复杂的类,它使用以下char** char** Names=new char* [1000] for (int j=0;j<1000;j++){Names[j]=new char [100];} 输出是:Names是:Alex 但是deleteing析构函数中的名称[0]会产生错误: ~Myclass() { cout<<"Name is: "<<Names[0]<<endl; delete[] Names[0]; } 使用new[]创建数组

我有一个复杂的类,它使用以下
char**

char** Names=new char* [1000]
for (int j=0;j<1000;j++){Names[j]=new char [100];}
输出是:
Names是:Alex

但是
delete
ing析构函数中的
名称[0]
会产生错误:

~Myclass()
{
cout<<"Name is: "<<Names[0]<<endl;
delete[] Names[0];
}

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

对于您的姓名,数组销毁应如下所示:

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

for(int j=0;j这看起来像是堆错误。根据您看到的错误消息类型,我怀疑Names[0]处指向char的指针指向静态内存中的字符串“Alex”

在程序中的某个地方,您可能已经执行了以下操作:

name[0]=“Alex”

在这种情况下,字符串“Alex”位于静态内存中。因此,当您调用:

删除[]个名称[0];

您说的是“删除静态内存中的某些内容”,这会导致您看到的运行时堆错误。需要了解的重要一点是,运算符
new
delete
仅在堆内存上工作

相反,如果您执行以下操作:

strcpy(名称[0],“Alex”);


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

你希望打印它,然后再删除它,对吗?请提供完整的示例。你如何在你的析构函数中删除它,或者你可能已经在其他地方删除了它。另外,为什么不使用
std::vector
?“我确保
名称[j]
for
j=0
指向某个字符串”。这是否意味着
Names[j]=“Alex”
?不要等到使用
std::vector
。使用资源管理对象(1)对初学者来说更容易掌握(2)惯用(3)不容易出错。回答得很好。问题正是你所描述的。我的代码中有
Names[0]=A_String
,其中
A_String
std::String
的变量。所以
Names[0]
指向堆栈中的某个地方,这就是为什么
delete
给了我错误。感谢感谢你指出这个错误。我在帖子中修复了这个问题,但问题的主要来源是另一件事。
7ff74ff1d000-7ff74ff85000 r-xp 00000000 fd:00 202613632                  /usr/lib64/libboost_serialization.so.1.53.0
7ff74ff85000-7ff750184000 ---p 00068000 fd:00 202613632                  /usr/lib64/libboost_serialization.so.1.53.0
7ff750184000-7ff750188000 r--p 00067000 fd:00 202613632                  /usr/lib64/libboost_serialization.so.1.53.0
7ff750188000-7ff750189000 rw-p 0006b000 fd:00 202613632                  /usr/lib64/libboost_serialization.so.1.53.0
7ff750189000-7ff7501a9000 r-xp 00000000 fd:00 201328495                  /usr/lib64/ld-2.17.so
for (int j=0;j<1000;j++)
 delete[] Names[j];
delete[] Names;