我想在运行时创建std::ifstream
对象,因为我创建了新的线程,
ifstream&
getMultiDataReaderStream()
{
ifstream ifs;
ifs.open(m_dataReaderFileName.c_str(), ios::in | ios::binary);
return ifs;
}
void
runThread(void *lpData)
{
ifstream& ifs1 = storeManager.getMultiDataReaderStream();
// code for reading while EOF
ifs1.close();
}
但是,我正在进行细分错误在上面的代码中出错...
答案 0 :(得分:1)
请参阅我的评论。
有很多方法可以解决这个问题。一个是这个:
void getMultiDataReaderStream(ifstream& ifs)
{
ifs.open(m_dataReaderFileName.c_str(), ios::in | ios::binary);
}
void
runThread(void *lpData)
{
ifstream ifs1;
getMultiDataReaderStream(ifs1);
// code for reading while EOF
ifs1.close();
}
另一个是: (不要使用它,这可行,但它很草率)
ifstream* getMultiDataReaderStream()
{
ifstream* ifs = new ifstream(m_dataReaderFileName.c_str(), ios::in | ios::binary);
return ifs;
}
void
runThread(void *lpData)
{
ifstream* ifs1 = getMultiDataReaderStream();
// code for reading while EOF
ifs1->close();
delete ifs1;
}
然后用智能ptr:
shared_ptr<ifstream> getMultiDataReaderStream()
{
shared_ptr<ifstream> ifs = shared_ptr<ifstream>(new ifstream(m_dataReaderFileName.c_str(), ios::in | ios::binary));
return ifs;
}
void
runThread(void *lpData)
{
shared_ptr<ifstream> ifs1 = getMultiDataReaderStream();
// code for reading while EOF
ifs1->close();
}
我相信还有其他方法......
答案 1 :(得分:1)
根据这个:Is std::ofstream movable?
ifstream
和ofstream
都应该是可移动的,因此您应该能够“只返回”。但是,许多编译器没有正确适应C'11的stdlib。例如,我刚刚在http://coliru.stacked-crooked.com/尝试了它,它似乎有g ++ 4.8而我仍然无法移动/返回任何fstream - 编译器仍然坚持使用不存在的复制构造函数而不是移动ctor。
这是一个众所周知的问题,GCC没有在流部分实现可移动性。对不起,我什么都不知道。你需要坚持使用变通办法,直到c'11支持变得更好。
答案 2 :(得分:0)
您永远不应该从函数返回本地对象的引用(或指针)。在这种情况下,getMultiDataReaderStream()
返回对对象(ifs
)的引用,该对象在您离开函数后立即被销毁。因此使用它无效并导致未定义的行为。例如,分段错误。