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);
我在 class 中打开一个 ifstream(下面代码中的 class File
),然后使用单独的 class 从 ifstream 中读取记录(下面的 class Record
)。但是,在创建初始对象后,当我从 subclass.
代码:
#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);