类中ifstream指针的分段错误



我在类中打开一个ifstream(下面代码中的类File(,然后使用一个单独的类从ifstream中读取一条记录(下面的类Record(。然而,在创建了初始对象之后,当我从子类访问ifstream时,代码会出错。

代码:

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
class Record {
std::ifstream * stream;
public:
Record(std::ifstream * infile) : stream(infile) {};
int position() { return (int) stream->tellg(); };  // function errors when run from main()
};
class File {
std::ifstream stream;
public:
File(std::string path) {
std::ifstream stream(path, std::ios::binary);
records.push_back(Record(&stream));
// I can call record.position() without error after creation
std::cout << "position after creation: " << records[0].position() << std::endl;
};
std::vector<Record> records;
};
int main() {
File file("/home/jmcrae/test.txt");
file.records[0].position(); // calling this segfaults
}
// gcc -lstdc++ -std=c++11 test.cpp

我很确定ifstream没有在Record类中初始化,但我不明白为什么不初始化。在File对象中创建Record,然后调用position()可以正常工作,但前提是在File对象中进行访问。如有任何帮助,我们将不胜感激。

您有两个名为stream的不同变量:File的成员属性和File的构造函数的局部变量。在File的构造函数中,初始化局部变量流,然后将指向该对象的指针传递给Record的构造函数。一旦File的构造函数退出,这个std::ifstream就超出了作用域。当Record试图解析其指向不再存在的std::ifstream的指针时,您将对segfault进行编码。

要解决此问题,请更换线路

std::ifstream stream(path, std::ios::binary);

带有

stream = std::ifstream(path, std::ios::binary);

相关内容

  • 没有找到相关文章

最新更新