[ifclass类[重复]中的ifstream指针的分段错误

问题描述 投票:0回答:1
我正在一个类(下面的代码中的类File)内打开一个ifstream,然后使用一个单独的类从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

我非常确定在Record类中没有对ifstream进行初始化,但是我不明白为什么不这样做。在Record对象中创建File,然后调用position()可以正常工作,但前提是在File对象中进行了访问。这里的任何帮助将不胜感激。
c++ segmentation-fault ifstream
1个回答
1
投票
您有两个不同的名为stream的变量:File的成员属性和File的构造函数的局部变量。在File的构造函数中,初始化

局部变量流,然后将指向该对象的指针传递给Record的构造函数。一旦File的构造函数退出,此std::ifstream就会超出范围。然后,当Record尝试将其指针解析为不再存在的std::ifstream时,您将进行段错误编码。

要解决此问题,请替换行

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

with

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

© www.soinside.com 2019 - 2024. All rights reserved.