为什么会出现bad_alloc错误?

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)

zen*_*hoy 7

不仅代码泄漏内存(创建一个新StudentreadStudent,它永远不会被删除),在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)