C++ 在进程之间移动STL对象
我知道这很奇怪,但我只是在玩 我试图通过两台机器之间的套接字在两个进程之间传输C++ 在进程之间移动STL对象,c++,stl,C++,Stl,我知道这很奇怪,但我只是在玩 我试图通过两台机器之间的套接字在两个进程之间传输std::map(使用内存固定区域中的placement new进行实例化):Master和Slave。我使用的地图有以下typedef: // A vector of Page objects typedef std::vector<Page*, PageTableAllocator<Page*> > PageVectorType;
std::map
(使用内存固定区域中的placement new进行实例化):Master
和Slave
。我使用的地图有以下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;
//页面对象的向量
类型定义
向量
页面文本;
//二进制“ip地址”到页面向量的映射
类型定义
标准::地图
页表类型;
PageTableAllocator
类负责将STL容器可能需要的任何内存分配到内存中的固定位置。例如,所有Page
对象和STL内部结构都在这个固定内存区域中实例化。这确保std::map
对象和分配器都放置在固定的内存区域中。我已经使用GDB来确保映射和分配器的行为正确(所有使用的内存都在固定区域中,应用程序的正常堆中没有任何内存)
假设Master
启动,初始化其所有STL结构和特殊内存区域,则会发生以下情况Slave
启动,打印出页面表的版本,然后查找Master
Slave
找到一个母版,删除它的页表版本,复制master
的页表版本(和特殊内存区域),并成功地打印出master
的页表版本。根据我在GDB中所做的工作,我可以执行许多只读操作
尝试添加到新复制的PageTableType
对象时,Slave
分配器的void构造(指针p、常量T和值)
方法出错。作为p
传入的值指向已分配的内存区域(根据Master
版本的std::map
)
<>我对C++对象结构一无所知,但我猜想,即使在我替换了<代码> PageTableType < /C>及其分配器的所有内存之后,“<代码> Slave < /COD>版本的<代码> PageTableType <代码>的对象状态必须一直在运行。我的问题是,这是否是一个合理的担忧。C++是否在对象实例化DIN?内存区域之外保持某种对象状态?
地图中使用的所有对象都是非POD。分配器也是如此。要回答您的具体问题:
C++是否在对象的内存区域之外保持某种对象状态? 答案是否定的。没有设置其他数据结构来“跟踪”对象或诸如此类的东西。C++使用显式内存分配模型,所以如果您选择负责分配和分配,那么您就有了完全的控制。
我怀疑你的代码中有什么地方出错了,但是既然你相信代码是正确的,那么你就在创造一些其他的原因来解释为什么你的代码可能会失败,并遵循这条路径。我会退后一步,仔细检查您的代码目前的工作方式,看看您是否能够确定问题所在。尽管STL类很复杂(特别是
std::map
),但它们最终只是代码,没有隐藏的魔力。您将确定共享内存哪个部分已分配的元数据存储在哪里?我重新定义了对内存分配代码的所有调用(malloc
,free
,等等)在我的申请中。当节点分配内存时,偏移量记录在此std::map
对象中。当Slave
试图更新映射(传输后)时,它会出现故障。这就是我的意思。录制位置?使用另一个固定内存区域中的新位置实例化std::map
。您是否正在尝试实现自己的共享内存功能?你考虑过吗?