在进程之间移动STL对象
Moving a STL object between processes
我知道这很奇怪,但我只是玩得很开心。
我正试图通过两台机器(Master
和Slave
)之间的套接字在两个进程之间传输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
启动,打印出页面表的版本,然后查找Master
。Slave
找到一个master,删除它的页表版本,复制Master
的页表(和特殊内存区域)版本,并且成功地打印出Master
的页表。根据我在GDB中所做的提示,我可以执行许多只读操作。
当尝试添加到新复制的PageTableType
对象时,Slave
会在分配器的void construct (pointer p, const T& value)
方法中出错。作为p
传入的值指向已经分配的内存区域(根据Master
的std::map
版本)。
我对C++对象结构一无所知,但我猜Slave
版本的PageTableType
中的对象状态一定一直存在,即使在我替换了PageTableType
及其分配器使用的所有内存之后也是如此我的问题是这是否是一个合理的担忧。C++是否在对象实例化数据的内存区域之外保持某种对象状态
地图中使用的所有对象都是非POD。分配器也是如此。
要回答您的特定问题:
C++是否在实例化对象的内存区域之外保持某种对象状态
答案是否。没有其他数据结构可以用来"跟踪"对象或诸如此类的东西。C++使用显式内存分配模型,所以如果你选择负责分配和释放,那么你就可以完全控制。
我怀疑你的代码中有什么地方出了问题,但既然你相信代码是正确的,你就在编造你的代码可能失败的其他原因,并遵循这条路径。我会退一步,仔细检查一下你的代码现在的工作方式,看看你是否能确定问题所在。尽管STL类很复杂(尤其是std::map
),但它们最终只是代码,并没有隐藏的魔力。
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 对象 C++ 向量的 STL 容器
- 如何复制存储在数组中的 STL 对象?
- 删除包含包含动态对象的 STL 容器的智能指针
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 为什么STL优先级队列错误地分配了我的类对象
- 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?
- 将对象(如 STL 对象)传入和传出静态库是否安全
- 如何在 MPI 中的 std::map 等C++中传递 STL 对象的消息
- 如何在共享内存(C++)中存储stl对象
- C++STL对象的内存分配
- gdb:将内存地址强制转换为 STL 对象
- 共享库与接口中STL对象的GCC兼容性
- 在进程之间移动STL对象
- 将STL对象传递给DLL
- 是否建议不要将大型STL对象作为值存储到std::unordered_map中?
- 我如何覆盖队列STL对象中的一些函数
- 将一种类型的STL对象存储到另一种类型的有效方法
- 使STL对象线程安全的标准方法
- 从函数返回STL对象而不触发move