是否可以将包含指针的向量放入共享的托管内存?

时间:2015-02-11 13:36:33

标签: c++ boost shared-memory

我想快速将包含指针向量的对象传递给另一个进程。这就是我试图发送的内容:

typedef std::vector<Shelve*> ShelveVec;

这是我尝试过的:

managed_shared_memory segment{create_only, "HwDescriptionObjects", 1056};

BeBoardInterface *sBeBoardInterface = segment.construct<BeBoardInterface>("BeBoardInterface")(fBeBoardFWMap);
CbcInterface *sCbcInterface = segment.construct<CbcInterface>("CbcInterface")(fBeBoardFWMap);
ShelveVec *sShelveVector = segment.construct<ShelveVec>("ShelveVector")(fShelveVector, alloc_inst);

qDebug() << "Size " << sShelveVector->size();

前两个共享内存对象可以正常工作,但是我已经尝试过通过阅读BOOST文档理解的向量,因为像begin指针分配这样的东西,实现起来有点棘手。从进程访问时,它最终为空。

这可能吗?

编辑,尽可能多的信息:

我做了一系列循环来初始化这些类:

uint32_t cNShelve = 0
for(auto &kv : mapSettings.keys())
{
    cShelveId=kv;
    fShelveVector.push_back(new Shelve(cShelveId));
    for(auto &kv_ : mapSettings.value(kv).keys()):
    {
        cBeId = kv_;
        BeBoard* cBeBoard = new BeBoard(cShelveId, cBeId);
        fShelveVector.at(cNShelve)->addBoard(cBeBoard);
    }
cNShelve++;
}

Edit2:一个廉价的解决方案:

managed_shared_memory segment{create_only, "HwDescriptionObjects", 1056};
uint32_t cNShelve = 0
for(auto &kv : mapSettings.keys())
{
    cShelveId=kv;
    Shelve *sShelve = segment.construct<Shelve>("Shelve")(cShelveId)
    fShelveVector->push_back(sShelve);
    for(auto &kv_ : mapSettings.value(kv).keys()):
    {
        cBeId = kv_;
        BeBoard* cBeBoard = segment.construct<BeBoard>("BeBoard")(cShelveId, cBeId);
        fShelveVector.at(cNShelve)->addBoard(cBeBoard);
    }
cNShelve++;
}

Contents of the HwDescription Objects

1 个答案:

答案 0 :(得分:2)

你可以。

但是你必须确保从共享内存中分配 指针。

如果您出示SSCCE,我会告诉您我该怎么做。


更新

在查看更新后的问题后,我必须说它会参与其中。您需要从共享内存中分配Shelve,并且同样适用于现在从堆中分配的所有内容 [1] (如BeBoards)。 / p>

建议:

  1. 如果真的只需要指针作为标识,请不要担心
  2. 也许你可以只分享矢量索引(如果它们在其他过程空间中有意义的话)
  3. 如果你让类分配器知道,你可以使用boost::container::scoped_allocator_adaptor来缓解疼痛。

    我在以下答案中使用范围分配器(来自Boost)创建了演示:


  4. [1] (从技术上讲,至少是您跨越流程边界访问的部分)