【问题标题】:Creating objects runtime创建对象运行时
【发布时间】:2013-11-27 09:22:46
【问题描述】:

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

但是,我得到分段错误在上面的代码中有问题......

【问题讨论】:

  • 您正在返回对在函数 getMultiDataReaderStream 完成后被销毁的对象的引用。此引用被使用,这会导致段错误。
  • OK..还有其他方法可以做到这一点...
  • 有几种方法可以解决这个问题。 1.传入对象的引用,然后调用open。 2. 使用 new 分配并返回一个指针。 2a.使用带有智能指针的解决方案 2。

标签: c++


【解决方案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;
}

然后用智能指针:

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();
}

我相信还有其他方法...

【讨论】:

  • 考虑在此处使用std::unique_ptr 而不是std::shared_ptr,因为没有证明需要共享所有权。
【解决方案2】:

据此:Is std::ofstream movable?

ifstreamofstream 都应该是可移动的,所以你应该能够简单地“直接退货”。但是,许多编译器的标准库没有正确适应 C'11。例如,我刚刚在 http://coliru.stacked-crooked.com/ 尝试过,它似乎有 g++ 4.8,但我仍然无法移动/返回任何 fstream - 编译器仍然坚持使用不存在的复制构造函数而不是移动 ctor。

这是 GCC 未在流部分实现可移动性的已知问题。对不起,我什么都不知道。在 c'11 支持变得更好之前,您需要坚持使用这些变通方法。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多