首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法列出所有共享内存对象的名称?

有没有办法列出所有共享内存对象的名称?
EN

Stack Overflow用户
提问于 2020-06-05 21:04:05
回答 1查看 112关注 0票数 1

因为可以使用boost的managed_shared_memoryfind方法访问共享内存对象,如下所示:

代码语言:javascript
复制
res = segment.find<MyType> ("name");

有没有办法列出某个段中定义的所有共享内存对象的名称?我需要它来调试,但没有找到用于此的boost API。

EN

回答 1

Stack Overflow用户

发布于 2020-06-07 04:07:25

您可以使用named_begin()named_end()迭代器。

一个小演示,创建具有随机长度的字符串的各种向量,并报告找到的数量:

代码语言:javascript
复制
#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/container/scoped_allocator.hpp>
#include <iostream>
#include <vector>

namespace bip = boost::interprocess;

using Mem = bip::managed_mapped_file;
template <typename T = void>
using Alloc = boost::container::scoped_allocator_adaptor<
        bip::allocator<T, Mem::segment_manager> >;
using String = boost::container::basic_string<char, std::char_traits<char>, Alloc<char> >;
template <typename T>
using Vector = boost::container::vector<T, Alloc<T> >;

int main() {
    auto mf = Mem(bip::open_or_create, "test.bin", 20ul<<30);
    std::cout << "Named #" << mf.get_segment_manager()->get_num_named_objects() << "\n";

    using Container = Vector<String>;

    for (auto to_create: {"foo", "bar", "qux"}) {
        auto& c = *mf.find_or_construct<Container>(to_create)(mf.get_segment_manager());
        auto n = rand()%10;
        for (int i = 0; i<n; ++i) {
            c.emplace_back(std::to_string(i*i));
        }
    }

    std::cout << "Named #" << mf.get_segment_manager()->get_num_named_objects() << "\n";

    for (auto it = mf.named_begin(); it != mf.named_end(); ++it) {
        std::string_view name(it->name(), it->name_length());
        std::cout << "Item " << name << " has " <<
            reinterpret_cast<Container const*>(it->value())->size() << " elements\n";
    }

}

打印

代码语言:javascript
复制
Named #0
Named #3
Item bar has 6 elements
Item foo has 3 elements
Item qux has 7 elements

当然,我不鼓励使用reinterpret_cast。像往常一样使用find_or_construct接口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62216015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档