【发布时间】:2023-03-10 03:46:01
【问题描述】:
我正在测试从 istream 读取各种数据技术的速度,因此我创建了一个函数来重复从文件创建 istream,以便测试的下一个方法可以使用该 istream。
using std::istream;
using std::string;
istream* getStreamFrom(string filepath)
{
std::filebuf init_buffer;
if (init_buffer.open(filepath, std::ios::in))
{
std::istream inputStream(&init_buffer);
init_buffer.close();
return &inputStream;
}
// file not found
istream inputStream(0);
return &inputStream;
}
然后我将 istream 传递给经过测试的方法,如下所示:
istream* data = getStreamFrom(FILEPATH);
someMethod(*data);
但是在someMethod 从 istream 读取时出现访问冲突:
void someMethod(istream& input)
{
string line;
while (std::getline(input, line)) // code failes here
// do something
}
为什么会发生这种情况,我该如何解决?是否找到文件无关紧要,两种情况都会发生。
【问题讨论】:
-
inputStream在getStreamFrom结束时被销毁。所以指向它的指针是无效的。 -
您正在返回一个局部变量的地址 - 这会导致 未定义的行为!例如,请参见:Can a local variable's memory be accessed outside its scope?。
-
即使您解决了
istream在函数返回时不再存在的问题,您也需要注意file_buf,因为它在函数返回时也不再存在 - 独立于istream。将缓冲区的地址传递给istream不会改变这一点。
标签: c++ pointers reference istream