class 中 ifstream 指针的分段错误

segmentation fault with ifstream pointer in class

我在 class 中打开一个 ifstream(下面代码中的 class File),然后使用单独的 class 从 ifstream 中读取记录(下面的 class Record)。但是,在创建初始对象后,当我从 subclass.

访问 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 class 中初始化,但我不明白为什么。在 File 对象中创建 Record,然后调用 position() 可以正常工作,但前提是在 File 对象中访问。如有任何帮助,我们将不胜感激。

您有两个名为 stream 的不同变量:File 的成员属性和 File 的构造函数的局部变量。在 File 的构造函数中,您初始化 局部变量 流,然后将指向此对象的指针传递给 Record 的构造函数。一旦 File 的构造函数退出,这个 std::ifstream 就会超出范围。当 Record 尝试将其指针解析为不再存在的 std::ifstream.

时,您编写代码然后出现段错误

要解决此问题,请替换行

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

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