簡體   English   中英

為什么這會導致bad_alloc錯誤?

[英]Why does this give a bad_alloc error?

目前,我正在嘗試為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;

}

代碼不僅會泄漏內存(在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);    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM