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

Is it Possible to Place Vectors Containing Pointers into Shared Managed Memory?

本文关键字:共享 内存 包含 指针 是否      更新时间:2023-10-16

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

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++;
}

第2版:廉价的解决方案:

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++;
}

HwDescription对象的内容

您可以。

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

如果你展示SSCCE,我会向你展示我该怎么做。


更新

在看了更新后的问题后,我必须说它会被卷入其中。您需要从共享内存中分配Shelve,对于现在从堆中分配的所有内部[1](如BeBoards)也是如此。

建议:

  1. 如果你真的只需要指针作为标识,不要担心
  2. 也许您可以只共享向量索引(以防它们在其他流程空间中有意义)
  3. 如果您让类分配器知道,您可以使用boost::container::scoped_allocator_adaptor来稍微减轻一些痛苦。

    我使用作用域分配器(来自Boost)创建了演示,答案如下:

    • 同时使用共享内存的多个实例
    • 制作boost:的非共享副本:进程间共享内存对象
    • 想要有效地克服Boost中映射中键类型之间的不匹配。进程间共享内存
    • https://stackoverflow.com/a/26855444/85371

[1](从技术上讲,至少是您从跨流程边界访问的零件)