删除在struct C ++中声明的数组元素

时间:2018-08-08 11:58:30

标签: c++ arrays dev-c++

我想删除根据学生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 ++的初学者,请帮助我如何删除存储在这些数组中的元素。谢谢

1 个答案:

答案 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的更多信息。

https://en.cppreference.com/w/cpp/string/basic_string