为什么这会给出一个bad_alloc错误
Why does this give a bad_alloc error?
目前,我正在尝试为学生设置一个成员函数,从cin读取字符串,用作此函数的参数,然后使用数据创建一个学生对象。然而,它给了我一个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);
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '