我知道这很奇怪,但我只是玩得开心。
我正在尝试传输 std::map
(在固定内存区域中使用 placement new 实例化)通过两台机器之间的套接字在两个进程之间:Master
和 Slave
.我正在使用的 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++ 是否在对象实例化 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/