1

目前,我正在尝试为 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

构造函数:

Student::Student(string tname){

  name = tname;

}

功能:

Student Student::readStudent(istream &i){

  Student *stud;

  string y;

  i >> y;

  stud = new Student(y);

  return  *stud;

}

测试学生.cpp:

 #include "Student.h"

int main(){

  Student *stud3;
  cout << "\nPlease insert name for student:\n";

  stud3->readStudent(cin);


return 0;

}
4

3 回答 3

7

代码不仅会泄漏内存(创建一个永远不会删除的新Studentin 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);
}

如果您在main(as 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);
 }
于 2011-11-21T13:31:46.917 回答
1

看起来您正在尝试实现工厂方法。如果是这种情况,那么您缺少 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;
}
于 2012-02-22T21:19:14.160 回答
-1

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

这不会抛出 bad_alloc:

Student Student::readStudent(std::istream& i)
{        
   std::string y;    
   i >> y;    
   return Student(y);    
}
于 2011-11-21T13:12:43.000 回答