1

現在、cinから文字列を読み取り、この関数の引数として使用され、データを使用してStudentオブジェクトを作成する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;

}
4

3 に答える 3

7

コードがメモリをリークする(削除されない新しいを作成する)Studentだけでなく、初期化されていないポインタを使用してを呼び出しています。おそらく、これはヒープを破壊しているため、newを呼び出すと。がスローされます。readStudentmainreadStudentstd::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);
 }
于 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 に答える