为什么我在 C++ 中将值插入 类 时出现 运行 时间错误
Why do I have a run-time Error inserting values into classes in C++
我需要一些帮助来解决这个问题。
我有一个名为 Grades 的 class,其中包含指向 class Student.
的指针
class Grades {
int numofstuds;
Student** studs;
public:
void insertgrades();
void printgrades();
};
class Student {
int id;
int grade;
public:
void getId();
void getGrade();
void printgrade();
};
我正在尝试将学生插入阵列螺柱:
void Grades::insertgrades() {
int i;
cout << "How many students ?" << endl;
cin >> numofstuds;
studs = new Student*[numofstuds];
for (i = 0; i < numofstuds; i++) {
studs[i]->getId();
studs[i]->getGrade();
}
}
'insertgrades' 是 class Grades 中的内部函数。
getId 和 getGrade 是 class 'Student' 中的内部函数,它们运行良好我已经检查过它们:
void Student::getId() {
do {
cout << "Enter id" << endl;
cin >> id;
} while (id<0);
}
void Student::getGrade() {
cout << "Enter grade:" << endl;
cin >> grade;
}
这是主要的:
int main() {
Grades a;
a.insertgrades();
return 0;
}
当我尝试将值插入 Id 或成绩时,我立即遇到了 运行 时间错误。
请帮忙!
伊桑.
您只创建了 "boxes" 来存储指向 Student
的指针,但您没有存储有效的指针。
您必须先创建学生才能使用。
void Grades::insertgrades() {
int i;
cout << "How many students ?" << endl;
cin >> numofstuds;
studs = new Student*[numofstuds];
for (i = 0; i < numofstuds; i++) {
studs[i] = new Student(); // add this line
studs[i]->getId();
studs[i]->getGrade();
}
}
感谢您的及时回复!
感谢@MikeCAT,我已经解决了这个问题。
我添加了另一个函数来实际创建一个学生:
Student* createstud() {
Student* News = new Student;
return News;
}
然后我这样更改我的函数:
void Grades::insertgrades() {
int i;
cout << "How many students ?" << endl;
cin >> numofstuds;
studs = new Student*[numofstuds];
for (i = 0; i < numofstuds; i++) {
**studs[i] = createstud();**
studs[i]->getId();
studs[i]->getGrade();
}
}
不确定为什么创建 Students** 数组是个坏主意,因为我计划在将来删除学生以便更容易更改数组内的指针,不是吗?
MikeCAT 的回答是正确的,但是请注意,您的操作很可能会导致内存泄漏。
显然我没有看到你的 class 析构函数 - 但是除非你仔细迭代 Studs 中的每个指针,调用 delete [],然后在 Studs 上调用 delete [] - 你最终会陷入一大堆泄漏的内存.
根据您使用的语言,我假设您更熟悉 VisualBasic 等引用计数语言 - 在 C++ 中,使用 New 分配内存并不能保证垃圾回收。
由于您没有存储 numberofstuds
,您将永远无法释放 MikeCAT 的答案中分配的内存。
如果您可以使用 C++11,请考虑使用以下代码片段以内存安全的方式处理此问题。
#include <memory>
#include <vector>
class Student;
class Grades {
int numofstuds;
std::vector<std::shared_ptr<Student> > studs;
public:
void insertgrades();
void printgrades();
};
和插入成绩例程:
void Grades::insertgrades() {
int i;
std::cout << "How many students ?" << std::endl;
std::cin >> numofstuds;
studs.resize(numofstuds);
for (auto Each_Student : studs)
{
Each_Student.reset(new student())
Each_Student->getId();
Each_Student->getGrade();
}
}
但是如果您必须使用原始指针(较旧的编译器,或较差的分级主体),请考虑以下析构函数MadCat 的回答
~Grades()
{
for (i = 0; i < numofstuds; i++)
{
delete studs[i];
}
delete [] studs;
}
[/edit]
我想补充一点,您存储数据的方法并没有错误,但是您可以更简单地做到这一点。
与其创建一个指针数组来存储数据,不如分配一个对象数组。
class Grades
{
//snipped out everything else
Student* studs;
}
void Grades::insertgrades()
{
int i;
cout << "How many students ?" << endl;
cin >> numofstuds;
studs = new Student[numofstuds];
for (i = 0; i < numofstuds; i++) {
studs[i].getId();
studs[i].getGrade();
}
}
在 C++ 中,指针是 "The address in memory of data",数组是 "the address in memory of a set of data",因此下面的代码应该可以帮助您理解为什么上面的代码有效。
char A;
//the following pointer will *point to the location of A*
char * A_p = & A;
char Array[100];
//this pointer will *point to the data set Array*
char * Array_p = Array;
//this pointer *points to a newly allocated set of data*
char * B_p = new char [100];
//indeed, we can also do this
//Set A to first character of array
A = *Array_p
A = Array_P[0]
A = *Array
A = Array[0]
//all of these do the same thing, as *when using an array, you're really using a pointer
delete [] B_P;
我需要一些帮助来解决这个问题。 我有一个名为 Grades 的 class,其中包含指向 class Student.
的指针class Grades {
int numofstuds;
Student** studs;
public:
void insertgrades();
void printgrades();
};
class Student {
int id;
int grade;
public:
void getId();
void getGrade();
void printgrade();
};
我正在尝试将学生插入阵列螺柱:
void Grades::insertgrades() {
int i;
cout << "How many students ?" << endl;
cin >> numofstuds;
studs = new Student*[numofstuds];
for (i = 0; i < numofstuds; i++) {
studs[i]->getId();
studs[i]->getGrade();
}
}
'insertgrades' 是 class Grades 中的内部函数。 getId 和 getGrade 是 class 'Student' 中的内部函数,它们运行良好我已经检查过它们:
void Student::getId() {
do {
cout << "Enter id" << endl;
cin >> id;
} while (id<0);
}
void Student::getGrade() {
cout << "Enter grade:" << endl;
cin >> grade;
}
这是主要的:
int main() {
Grades a;
a.insertgrades();
return 0;
}
当我尝试将值插入 Id 或成绩时,我立即遇到了 运行 时间错误。 请帮忙! 伊桑.
您只创建了 "boxes" 来存储指向 Student
的指针,但您没有存储有效的指针。
您必须先创建学生才能使用。
void Grades::insertgrades() {
int i;
cout << "How many students ?" << endl;
cin >> numofstuds;
studs = new Student*[numofstuds];
for (i = 0; i < numofstuds; i++) {
studs[i] = new Student(); // add this line
studs[i]->getId();
studs[i]->getGrade();
}
}
感谢您的及时回复! 感谢@MikeCAT,我已经解决了这个问题。 我添加了另一个函数来实际创建一个学生:
Student* createstud() {
Student* News = new Student;
return News;
}
然后我这样更改我的函数:
void Grades::insertgrades() {
int i;
cout << "How many students ?" << endl;
cin >> numofstuds;
studs = new Student*[numofstuds];
for (i = 0; i < numofstuds; i++) {
**studs[i] = createstud();**
studs[i]->getId();
studs[i]->getGrade();
}
}
不确定为什么创建 Students** 数组是个坏主意,因为我计划在将来删除学生以便更容易更改数组内的指针,不是吗?
MikeCAT 的回答是正确的,但是请注意,您的操作很可能会导致内存泄漏。 显然我没有看到你的 class 析构函数 - 但是除非你仔细迭代 Studs 中的每个指针,调用 delete [],然后在 Studs 上调用 delete [] - 你最终会陷入一大堆泄漏的内存.
根据您使用的语言,我假设您更熟悉 VisualBasic 等引用计数语言 - 在 C++ 中,使用 New 分配内存并不能保证垃圾回收。
由于您没有存储 numberofstuds
,您将永远无法释放 MikeCAT 的答案中分配的内存。
如果您可以使用 C++11,请考虑使用以下代码片段以内存安全的方式处理此问题。
#include <memory>
#include <vector>
class Student;
class Grades {
int numofstuds;
std::vector<std::shared_ptr<Student> > studs;
public:
void insertgrades();
void printgrades();
};
和插入成绩例程:
void Grades::insertgrades() {
int i;
std::cout << "How many students ?" << std::endl;
std::cin >> numofstuds;
studs.resize(numofstuds);
for (auto Each_Student : studs)
{
Each_Student.reset(new student())
Each_Student->getId();
Each_Student->getGrade();
}
}
但是如果您必须使用原始指针(较旧的编译器,或较差的分级主体),请考虑以下析构函数MadCat 的回答
~Grades()
{
for (i = 0; i < numofstuds; i++)
{
delete studs[i];
}
delete [] studs;
}
[/edit]
我想补充一点,您存储数据的方法并没有错误,但是您可以更简单地做到这一点。 与其创建一个指针数组来存储数据,不如分配一个对象数组。
class Grades
{
//snipped out everything else
Student* studs;
}
void Grades::insertgrades()
{
int i;
cout << "How many students ?" << endl;
cin >> numofstuds;
studs = new Student[numofstuds];
for (i = 0; i < numofstuds; i++) {
studs[i].getId();
studs[i].getGrade();
}
}
在 C++ 中,指针是 "The address in memory of data",数组是 "the address in memory of a set of data",因此下面的代码应该可以帮助您理解为什么上面的代码有效。
char A;
//the following pointer will *point to the location of A*
char * A_p = & A;
char Array[100];
//this pointer will *point to the data set Array*
char * Array_p = Array;
//this pointer *points to a newly allocated set of data*
char * B_p = new char [100];
//indeed, we can also do this
//Set A to first character of array
A = *Array_p
A = Array_P[0]
A = *Array
A = Array[0]
//all of these do the same thing, as *when using an array, you're really using a pointer
delete [] B_P;