为什么这会给出一个bad_alloc错误

Why does this give a bad_alloc error?

本文关键字:一个 bad 错误 alloc 为什么      更新时间:2023-10-16

目前,我正在尝试为学生设置一个成员函数,从cin读取字符串,用作此函数的参数,然后使用数据创建一个学生对象。然而,它给了我一个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
构造函数:

Student::Student(string tname){
  name = tname;
}

功能:

Student Student::readStudent(istream &i){
  Student *stud;
  string y;
  i >> y;
  stud = new Student(y);
  return  *stud;
}

testStudent.cpp:

 #include "Student.h"
int main(){
  Student *stud3;
  cout << "nPlease insert name for student:n";
  stud3->readStudent(cin);

return 0;
}

不仅代码泄漏内存(在readStudent中创建一个从未删除的新Student),在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);
}
如果您在main中读入名称(作为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);
 }

看起来你正在尝试实现一个工厂方法。如果是这种情况,那么您就错过了static关键字和readStudent调用的正确语法。

class Student{
public:
    Student(std::string tname);
    static Student* readStudent(std::istream &i);
private:
    std::string name
};
Student::Student(std::string tname) {
    name = tname;
}
Student* Student::readStudent(std::istream &i){
    std::string y;
    i >> y;
    return new Student(y);
}
int main(int argc, char* argv[]){
    Student *stud3 = NULL;
    std::cout << "nPlease insert name for student:n";
    stud3 = Student::readStudent(cin);
    return 0;
}

您正在使用new在堆上分配并且从不释放它,因此您耗尽内存并获得bad_alloc。对于每个new,都应该有一个delete

这不会抛出bad_alloc:

Student Student::readStudent(std::istream& i)
{        
   std::string y;    
   i >> y;    
   return Student(y);    
}