[英]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.