首页 > 解决方案 > 保持 boost::allocators 作为类成员。可以使用它们来初始化容器

问题描述

我想在共享内存中放入一个 struct1,其中包含一个包含 wstring 的 struct2 向量。所以:

我想将 wchar 和 struct2 分配器保留为类的成员,这样我就不必保留对 shm 的引用(因为我不必每次都使用shm.get_manager()来创建它们操纵数据)。但无论我使用什么配置,它都会失败。

现在,我在以下位置收到以下错误:

SharedData(InnerDataAllocator eAlloc):data(eAlloc) { 

错误 C2664:
'boost::container::vector,void>::vector(const boost::container::vector,void> &)': 无法将参数 1 从 'InnerDataAllocator' 转换为 'const boost::container::新分配器&'

头文件.h

typedef bip::allocator<wchar_t, bip::managed_shared_memory::segment_manager> CharAllocator;
typedef bip::basic_string<wchar_t, std::char_traits<wchar_t>, CharAllocator> MyShmString;

class InnerData {
public:
    uint64_t id;
    MyShmString name;
    uint8_t status;
    static const uint8_t defaultStatus = 3;

    InnerData(CharAllocator cAlloc):name(cAlloc) {

    }
};

typedef bip::allocator<InnerData, bip::managed_shared_memory::segment_manager> InnerDataAllocator;
class SharedData {
public:
    int a;
    bool newRequestUntreated = false;
    bool newReplyUntreated = false;

    bip::vector<InnerData> data; 
    SharedData(InnerDataAllocator eAlloc):data(eAlloc) {

    }
};

UsualInnerData{//like InnerData but with normal std::wstring
public:
    uint64_t id;
    std::wstring name;
    uint8_t status;
    static const uint8_t status Default = 3;
};

class Zone {
public:
    SharedData * sharedData;

    CharAllocator     charAllocator;
    InnerDataAllocator   innerDataAllocator;

    void putInShm(const std::vector<UsualInnerData> &in);
    void initializeZone(std::string &_name, std::string &_nameSeg);
    static bool alreadyCreated;
};

代码.cpp

void Zone::createNewCheckingZone(std::string &_name, std::string &_nameSeg) {
    if (!alreadyCreated) {
        int size = getOverallSize();
        bip::managed_shared_memory shm(bip::create_only, _name.c_str(), 10000 + size);
        CharAllocator scharAllocator(shm.get_segment_manager());
        swap(charAllocator, scharAllocator); //use of swap because = operator says Not assignable from other allocator

        InnerDataAllocator sinnerDataAllocator(shm.get_segment_manager());
        swap(innerDataAllocator, sinnerDataAllocator);
        sharedData = shm.construct<SharedData>(_nameSeg)(innerDataAllocator);
        alreadyCreated = true;
    }
    return ;
}
void Zone::putInShm(const std::vector<UsualInnerData> &in){
    InnerData newInnerData(charAllocator);
    for (auto a : in) {
        newInnerData.id = a.id;
        newInnerData.name = a.xml.c_str();
        newInnerData.status = InnerData::defaultStatus;
        sharedData->data.push_back(newInnerData);
    }
    return;
}

我可以毫无问题地使用 Zone 的 charAllocator 初始化 InnerData.name ,为什么我不能这样做,即使用 Zone 的 innerDataAllocator 初始化 SharedData.data ?

标签: c++boostcontainersallocatorboost-interprocess

解决方案


实际上,我犯了一个错误,(昨天完成了我的咖啡包,现在开始感受),我定义:

typedef  bip::vector<InnerData, InnderDataAllocator> InnerDataVector;

但没有用它来定义 SharedData.data。这是我如何改变它:

class SharedData {
public:
    int a;
    bool newRequestUntreated = false;
    bool newReplyUntreated = false;
    InnerDataVector data; 
    SharedData(InnerDataAllocator eAlloc):data(eAlloc) {}
};

现在它编译了。


推荐阅读