在进程之间移动STL对象

Moving a STL object between processes

本文关键字:STL 对象 移动 之间 进程      更新时间:2023-10-16

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

我正试图通过两台机器(MasterSlave)之间的套接字在两个进程之间传输std::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启动,打印出页面表的版本,然后查找MasterSlave找到一个master,删除它的页表版本,复制Master的页表(和特殊内存区域)版本,并且成功地打印出Master的页表。根据我在GDB中所做的提示,我可以执行许多只读操作。

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

我对C++对象结构一无所知,但我猜Slave版本的PageTableType中的对象状态一定一直存在,即使在我替换了PageTableType及其分配器使用的所有内存之后也是如此我的问题是这是否是一个合理的担忧。C++是否在对象实例化数据的内存区域之外保持某种对象状态

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

要回答您的特定问题:

C++是否在实例化对象的内存区域之外保持某种对象状态

答案是。没有其他数据结构可以用来"跟踪"对象或诸如此类的东西。C++使用显式内存分配模型,所以如果你选择负责分配和释放,那么你就可以完全控制。

我怀疑你的代码中有什么地方出了问题,但既然你相信代码是正确的,你就在编造你的代码可能失败的其他原因,并遵循这条路径。我会退一步,仔细检查一下你的代码现在的工作方式,看看你是否能确定问题所在。尽管STL类很复杂(尤其是std::map),但它们最终只是代码,并没有隐藏的魔力。