c++ - 结构域上的智能指针

标签 c++ boost

我读过不能存储 std::auto_ptrstd::vectorboost::ptr_vector可以改用。我已经能够这样做,但我不知道如何使用 ptr_vector ,当我不想存储指针,而是一个具有指针成员的结构时。

在这个例子中,我想打开一些文件并存储相关的 ofstream带有一些附加数据的对象,供以后使用。我想更换 file领域struct data用智能指针。自 vector<data> v应该是主人,我认为一个shared_ptr会工作,但不合适。

我应该用什么替换裸指针file与?

#include <iostream>
#include <fstream>
#include <vector>

struct data {
  std::string filename;
  std::ofstream* file;

  data(const std::string filename, std::ofstream* file)
    : filename(filename), file(file)
  {
  }
};

std::vector<data> open_files()
{
  std::vector<data> v;
  v.push_back(data("foo", new std::ofstream("foo")));
  return v;
}

int main()
{
  std::vector<data> v = open_files();

  /* use the files */
  *(v[0].file) << "foo";

  delete v[0].file;  // either rely on dtor to close(), or call it manually
}

更新: 我觉得我在描述我的问题时做得不够理想,让我尝试另一个例子。我也在寻找 C++03 解决方案:

#include <memory>
#include <vector>
#include <boost/ptr_container/ptr_vector.hpp>

struct T {
  std::auto_ptr<int> a;
};

int main()
{
  // instead of
  // std::vector<std::auto_ptr<int> > v;
  // use
  boost::ptr_vector<int> v;

  // what to use instead of
  // std::vector<T> w;
}

最佳答案

关于您的数据类,我建议使用 std::unique_ptr<std::ofstream> .这并不是为了避免意外内存泄漏,因为您是在构造函数中删除指针,而是为了明确所有权。您的代码的用户必须知道什么 data正在处理它在构造函数中采用的指针:

std::ofstream ofs;
{
   data d1("crash", &ofs);
} // error! d1 will attempt to delete stack allocated object

std::ofstream* pOfs = new std::ofstream(....);
data d2("crash again", pOfs);
delete pOFs; // user thinks data makes a deep copy

但是,对于 unique_ptr意图明确,因此更难出错:

data d3("OK", std::unique_ptr<std::ofstream>(new std::ofstream(....)));

std::unique_ptr<std::ofstream> pOfs2(new std::ofstream(....));
data d4("OK", pOfs2); // safe, pOfs's contents have been safely moved

// we can check pOfs2 after the move
if (pOfs2) { /*  */ } 

关于c++ - 结构域上的智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13361092/

相关文章:

c++ - 编译库以便 GDB 自动查找源代码

c++ - BOOST_PHOENIX_ADAPT_FUNCTION 导致无效模板错误

c++ - Hana BOOST_HANA_DEFINE_STRUCT 不适用于 std::unique_ptr

c++ - 在 vf2_sub_graph_iso 中使用属性映射进行等价

c++ - fusion 适应结构中的 Boost spirit x3 元组成员

c++ - Win32 DrawText 颜色和显示

c++ - 在不捕获的情况下访问 lambda 表达式中的 constexpr 变量

C++ 继承和赋值运算符

c++ - 如何将字符串转换为类名

c++ - `g++ -E file.cxx` 的 Visual Studio 2010 模拟是什么?