Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在进程之间移动STL对象_C++_Stl - Fatal编程技术网

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
。您是否正在尝试实现自己的共享内存功能?你考虑过吗?