C++ c++;程序已在运算符[]上触发断点

C++ c++;程序已在运算符[]上触发断点,c++,C++,我正在创建班级学生,我得到一个错误: 程序已触发断点 在操作符[]上。请帮帮我,告诉我哪里错了,哪里缺了 固定的: #include "stdafx.h" #include <iostream> class Student { public: Student(); ~Student(); void Show(); private: char* Name; char* Surname; char* DateOfBir

我正在创建班级学生,我得到一个错误:
程序已触发断点
操作符[]
上。请帮帮我,告诉我哪里错了,哪里缺了

固定的:

#include "stdafx.h"
#include <iostream>

class Student {
public:
    Student();
    ~Student();
    void Show();
private:
    char* Name;
    char* Surname;
    char* DateOfBirth;
    unsigned long PhoneNumber;
};

Student::Student() {
    Name = nullptr;
    Surname = nullptr;
    DateOfBirth = nullptr;
}

Student::~Student() {
    if (Name != nullptr) delete[] Name;
    if (Surname != nullptr) delete[] Surname;
    if (DateOfBirth != nullptr) delete[] DateOfBirth;
}

void Student::Show() {
    std::cout << Name << " " << Surname << "\t" << DateOfBirth << "\t" << PhoneNumber << std::endl;
}

class StudentGroup {
public:
    StudentGroup();
    ~StudentGroup();
    void Add(char* Name, char* Surname, char* DateOfBirth, unsigned long PhoneNumber);
    Student& operator[](int index); 
private:
    Student* stud;
    int length;
};

StudentGroup::StudentGroup() {
    length = 0;
    stud=nullptr;
}

StudentGroup::~StudentGroup() {
    delete[] stud;

}

void StudentGroup::Add(char* Name, char* Surname, char* DateOfBirth, unsigned long PhoneNumber)
{
    Student* stud1; 
    stud1 = new Student[length+1];
    for (int i = 0; i < length; i++)
        stud1[i] = stud[i];
    delete [] stud;
    stud = stud1;   
    stud[length].SetName(Name);
    stud[length].SetSurname(Surname);
    stud[length].SetDateOfBirth(DateOfBirth);
    stud[length].SetPhoneNumber(PhoneNumber);
    length++;
}

Student& StudentGroup::operator[](int index) {
    return stud[index];
}

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,"Russian");
    StudentGroup students;
    students.Add("Ivan","Ivanov","2010-01-01",234234422);
    students.Add("Petr","Petrov","2012-01-01",365753663);
    students[0].Show();
    return 0;
}
#包括“stdafx.h”
#包括
班级学生{
公众:
学生();
~Student();
void Show();
私人:
字符*名称;
查*姓;
字符*出生日期;
无符号长电话号码;
};
学生::学生(){
Name=nullptr;
姓氏=nullptr;
出生日期=nullptr;
}
学生::~Student(){
如果(Name!=nullptr)删除[]名称;
如果(姓氏!=nullptr)删除[]姓氏;
如果(DateOfBirth!=nullptr)删除[]DateOfBirth;
}
void Student::Show(){

std::cout您的struct
student
有指针,正好有3个指针


很明显,调用
delete[]stud;
而不处理删除每个
student
对象的
char*Name
char*姓氏
char*DateOfBirth
成员,会导致
堆损坏错误
drescherjm在注释中是正确的

您的构造函数不会初始化
StudentGroup::stud
,因此当您尝试增加它的大小时,可以调用
delete[]

要解决此问题,您应该:

StudentGroup::StudentGroup() {
    stud = nullptr;
    length = 0;
    nextIndex = 0;
}

请帮助我,告诉我出了什么问题,您可能需要花费一些时间进行调试,以便告诉我们您认为哪里出了问题。您的构造函数有缺陷,因为它没有将
stud
初始化为null ptr。简短回答:未定义的行为。我看到了它在中如何调用它(至少)两种不同的方法,在
StudentGroup::AddStudent
中。解决内存分配问题并使用
std::string
。请看,这是处理具有指针、删除机制的指针对象的好方法!这将导致内存泄漏,但我不知道这将如何导致堆损坏。非常简单!运行代码!堆损坏错误出现!在vs 2017 c++11!中!请告诉我,删除包含一些由“new”运算符启动的指针成员(数组)的指针对象只会导致内存泄漏???也不会导致堆损坏??谢谢,但错误在
运算符[]中
。这里怎么了?请看上面的评论,在vs 2017 c++11中添加第二个学生和“delete[]stud”时,我遇到了“HEAP corrupt error”发布之前您测试过它吗?如果是真的,您使用的是哪个平台或编译器?@AliRazmkhah:不管repl.it使用什么和gdb。嗨,这没有帮助,错误在
操作符[]中。