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您的structstudent
有指针,正好有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。嗨,这没有帮助,错误在操作符[]中。