创建对象运行时

时间:2013-11-27 09:22:46

标签: c++

我想在运行时创建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();
}

但是,我正在进行细分错误在上面的代码中出错...

3 个答案:

答案 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?

ifstreamofstream 都应该是可移动的,因此您应该能够“只返回”。但是,许多编译器没有正确适应C'11的stdlib。例如,我刚刚在http://coliru.stacked-crooked.com/尝试了它,它似乎有g ++ 4.8而我仍然无法移动/返回任何fstream - 编译器仍然坚持使用不存在的复制构造函数而不是移动ctor。

这是一个众所周知的问题,GCC没有在流部分实现可移动性。对不起,我什么都不知道。你需要坚持使用变通办法,直到c'11支持变得更好。

答案 2 :(得分:0)

您永远不应该从函数返回本地对象的引用(或指针)。在这种情况下,getMultiDataReaderStream()返回对对象(ifs)的引用,该对象在您离开函数后立即被销毁。因此使用它无效并导致未定义的行为。例如,分段错误。