Почему это дает ошибку bad_alloc? - PullRequest
1 голос
/ 21 ноября 2011

В настоящее время я пытаюсь настроить функцию-член для 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;

}

testStudent.cpp:

 #include "Student.h"

int main(){

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

  stud3->readStudent(cin);


return 0;

}

Ответы [ 3 ]

7 голосов
/ 21 ноября 2011

Мало того, что код утечки памяти (создание нового 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);
}

Возможно, было бы также лучше, если бы вы прочитали имя в 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);
 }
1 голос
/ 23 февраля 2012

Похоже, вы пытаетесь реализовать фабричный метод. Если это так, то вам не хватает статического ключевого слова и правильного синтаксиса для вызова 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;
}
0 голосов
/ 21 ноября 2011

Вы размещаете в куче, используя new и никогда не освобождая ее, таким образом, вы исчерпали память и получили bad_alloc.Для каждого new должно быть delete.

Это не сгенерирует bad_alloc:

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