我想删除根据学生struct声明的数组元素。我仅包含部分代码以减少混乱。请在下面的两种相关情况下找到代码:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
struct student
{
char name[20];
int id;
};
struct teacher
{
char name[20];
int id;
};
int main()
{
case 1:
cout<<"\t\t\t*********enter record**********"<<endl;
student st[2];
for(int count=0; count<2;count++)
{
cout<<"\t\t\t\tenter student "<<count<<" name"<<endl;
cin>>st[count].name;
cout<<"\t\t\t\tenter student "<<count<<" id"<<endl;
cin>>st[count].id;
}
break;
case 5:
cout<<"\t\t\t*********delete record********"<<endl;
for(int count=0;count<10;count++)
{
delete st[count].name;
}
break;
}
如情况5所示,我试图使用delete st [count] .name删除数组中的元素;
在删除的情况下,我想删除名称和ID的元素。但是,使用delete st [count] .name给我一个 [警告]删除数组。当我运行程序时,它会给我一个程序接收到信号SIGTRAP,跟踪/断点陷阱。我是C ++的初学者,请帮助我如何删除存储在这些数组中的元素。谢谢
答案 0 :(得分:2)
您的代码中有两个主要问题。
cin>>st[count].name
您正在用用户输入填充数组,但是该数组只能容纳20个元素(最后一个必须是空终止符),如果用户输入的文本超过19个元素,则程序将导致未定义的行为
稍后,您正在使用
delete st[count].name
您正在堆栈上分配的数组上使用delete
,这又是未定义的行为,如果使用运算符{{1}定位对象,则只需要使用delete
},也应该对阵列使用new
而不是delete[]
。
对程序最简单的修复方法是将delete
更改为char name[20]
,std::string
会自动调整其大小以适应它动态保留的文本,同时还要注意清除其后的内存,因此您不必担心,以后还会有许多有用的方法,您可能会发现它们有用,您可以阅读有关std::string
的更多信息。