Mar*_*ube 1 c++ istream bad-alloc
目前我正在尝试为Student设置一个成员函数,该函数从cin读取一个字符串,用作该函数的参数,然后用该数据创建一个Student对象.但是,它是否给我一个bad_alloc错误.我知道函数正在获取字符串,但是在创建新对象后它会出现此错误.
错误:
./a.out
Please insert name for student:
Bob_Russel
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
Run Code Online (Sandbox Code Playgroud)
构造函数:
Student::Student(string tname){
name = tname;
}
Run Code Online (Sandbox Code Playgroud)
功能:
Student Student::readStudent(istream &i){
Student *stud;
string y;
i >> y;
stud = new Student(y);
return *stud;
}
Run Code Online (Sandbox Code Playgroud)
testStudent.cpp:
#include "Student.h"
int main(){
Student *stud3;
cout << "\nPlease insert name for student:\n";
stud3->readStudent(cin);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不仅代码泄漏内存(创建一个新Student的readStudent,它永远不会被删除),在main您使用的是未初始化的指针调用readStudent.可能这会破坏你的堆,这样对new的调用会抛出一个std::bad_alloc.
再看看C++内存管理和对象生命周期.这里根本没有必要使用指针.作为起点,您main可以修改为:
int main() {
Student stud3;
std::cout << "Please insert name for student:" << std::endl;
stud3.readStudent(std::cin);
}
Run Code Online (Sandbox Code Playgroud)
如果你在main(作为a std::string)中读取名称,然后将名称直接传递给Student构造函数,也许会更好:
int main() {
std::cout << "Please insert name for student:" << std::endl;
// Read in the name.
std::string name;
std::cin >> name;
// Create the student with the input name.
Student stud3(name);
}
Run Code Online (Sandbox Code Playgroud)