c++ - 在进程之间移动 STL 对象

标签 c++ stl

我知道这很奇怪,但我只是玩得开心。

我正在尝试传输 std::map (在固定内存区域中使用 placement new 实例化)通过两台机器之间的套接字在两个进程之间:MasterSlave .我正在使用的 map 有这个 typedef :

   // A vector of Page objects
   typedef
      std::vector<Page*,
           PageTableAllocator<Page*> >
      PageVectorType;

   // A mapping of binary 'ip address' to a PageVector
   typedef
      std::map<uint32_t,
           PageVectorType*,
           std::less<uint32_t>,
           PageTableAllocator<std::pair<uint32_t, PageVectorType*> > >
      PageTableType;

PageTableAllocator<T>类负责将 STL 容器可能想要/需要的任何内存分配到内存中的固定位置。例如,所有 Page对象和 STL 内部结构正在这个固定的内存区域中被实例化。这确保了 std::map对象和分配器放置在固定的内存区域中。我使用 GDB 来确保映射和分配器的行为正确(所有使用的内存都在固定区域中,应用程序的正常堆上没有任何内容)。

假设Master启动,初始化它的所有 STL 结构和特殊内存区域,发生以下情况。 Slave开始,打印出它的页表版本,然后寻找 Master . Slave找到一个 master,删除它的页表版本,复制 Master的页表版本(和特殊内存区域),成功打印出 Master页表的版本。根据我在 GDB 中所做的工作,我可以执行许多只读操作。

尝试添加到新复制的 PageTableType 时对象,Slave分配器的故障 void construct (pointer p, const T& value)方法。传入的值为 p指向已分配的内存区域(根据 Masterstd::map 版本)。

我对 C++ 对象结构一无所知,但我猜测对象状态来自 Slave PageTableType 的版本即使在我更换了 PageTableType 的所有内存之后,它也必须闲逛及其使用的分配器。 我的问题是这是否是一个有效的问题。 C++ 是否在对象实例化 din 的内存区域之外维护某种对象状态?

map 中使用的所有对象都是非 POD。分配器也是如此。

最佳答案

回答您的具体问题:

Does C++ maintain some sort of object state outside of the area of memory that object was instantiated in?

答案是。没有设置其他数据结构来“跟踪”对象或任何类似的东西。 C++ 使用显式内存分配模型,因此如果您选择负责分配和释放,那么您就拥有完全的控制权。

我怀疑您的代码某处有问题,但由于您认为代码是正确的,所以您正在发明一些其他原因来解释您的代码可能会失败,并改为遵循该路径。我会退后一步,仔细检查您的代码现在的工作方式,看看您是否可以确定问题所在。虽然 STL 类很复杂(尤其是 std::map),但它们最终只是代码,其中没有隐藏的魔法。

关于c++ - 在进程之间移动 STL 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243830/

相关文章:

c++ - constexpr 构造函数是否允许 return 语句?

c++ - C++ 类中的构造函数

c++ - 插入MYSQL数据库表后出现错误消息

c++ - 这个函数只会被调用一次吗?

c++ - 无法理解使用 C++ STL 的 Stock 跨度的线性时间方法

c++ - 从 C++11 中的 STL 容器继承

c++ - 为什么我的 vector 迭代器没有显示 operator=?

c++ - CMake:是否应该自动检测到 "target_link_libraries"链接的库的更改?

c++ - C++ 列表中的错误::排序

c++ - 有没有好的 boost::filesystem 替代方案?