boost 中的共享内存向量

2023-12-15

我有以下代码。尝试拥有一个具有字符串和数组结构的共享内存向量。但是当我编译代码时出现错误:

 usr/local/include/boost/container/vector.hpp:1819:4: error: no matching function for call to ‘InData::InData(InData* const&)’

任何建议如何解决这个问题。我是 Boost 的新手。

#include <iostream>
#include <string>
#include <cstdlib>
#include <boost/interprocess/ipc/message_queue.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/containers/vector.hpp>

using namespace boost::interprocess;

typedef boost::interprocess::basic_string<char> shared_string;

    struct InData
    {
        int X,Y,H,W;
        shared_string Label;
    };

    int main()
    {

        shared_memory_object::remove("MySharedMemory");
        managed_shared_memory managed_shm(create_only, "MySharedMemory", 10000);

        InData tData;// = managed_shm.construct<InData>("InDataStructure")();

        tData.Label = "Hello World";
        tData.H = 1;
        tData.W = 1;
        tData.Y = 1;
        tData.X = 1;

        typedef allocator<InData,managed_shared_memory::segment_manager> tStructData;
        typedef vector<InData,tStructData>  MyVector;

        //Initialize shared memory STL-compatible allocator
         tStructData alloc_inst (managed_shm.get_segment_manager());

         //Construct a vector named "MyVector" in shared memory with argument alloc_inst
          MyVector *myvector = managed_shm.construct<MyVector>("MyVector")(alloc_inst);

          //InData data;
          myvector->push_back(&tData);

        return 0;
    }

如果只是做myvector->push_back(tData)

/usr/local/include/boost/container/detail/advanced_insert_int.hpp:166:10: error: no match for ‘operator=’ (operand types are ‘InData’ and ‘const value_type {aka const InData}’)

我已经对我的评论进行了实时编码:录制的会话

修复后的代码如下。一些注释(不过,请观看流媒体会议):

  1. 您未能为“共享”字符串提供分配器。这意味着它使用std::allocator并且分配是从程序堆中完成的。哎呀。如果你幸运的话,你的程序将会死掉。

  2. 一旦你给出shared_string正确的分配器,你会发现连锁反应。您需要在构造时传入分配器实例shared_string因为进程间分配器实例是not默认可构造。

    经验法则:有状态分配器是痛苦的。如果你避免痛苦,那么你就做错了(并且从错误的堆中分配)

  3. 命名很重要:

    typedef allocator<InData, managed_shared_memory::segment_manager> tStructData;
    

    为什么命名你的分配器类型tStructData?你也可以称之为XXX。所以,将其更改为

    typedef allocator<InData, managed_shared_memory::segment_manager> salloc;
    

    当我试图理解你的代码时,这花了我一段时间......

  4. 而不是显式创建alloc_inst,考虑使用隐式转换segment_manager

  5. The line

    myvector->push_back(&tData);
    

    试图推动pointer到类对象的向量中。无论您的分配器如何,这永远不会起作用

Live On Coliru

#include <iostream>
#include <string>
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/containers/vector.hpp>

using namespace boost::interprocess;

struct InData;
typedef allocator<InData, managed_shared_memory::segment_manager> salloc;

typedef boost::interprocess::basic_string<char, std::char_traits<char>, salloc::rebind<char>::other> shared_string;

struct InData {
    int X, Y, H, W;

    InData(salloc alloc) : Label(alloc) {}

    shared_string Label;
};

int main() {

    shared_memory_object::remove("MySharedMemory");
    managed_shared_memory managed_shm(create_only, "MySharedMemory", 10000);

    // Initialize shared memory STL-compatible allocator
    salloc alloc_inst(managed_shm.get_segment_manager());

    InData tData(alloc_inst); // = managed_shm.construct<InData>("InDataStructure")();

    tData.Label = "Hello World";
    tData.H = 1;
    tData.W = 1;
    tData.Y = 1;
    tData.X = 1;

    // Construct a vector named "MyVector" in shared memory with argument alloc_inst
    typedef vector<InData, salloc> MyVector;
    MyVector *myvector = managed_shm.construct<MyVector>("MyVector")(alloc_inst);

    // InData data;
    myvector->push_back(tData);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost 中的共享内存向量 的相关文章

  • 用 HashMap[Int, Vector[Int]] (Scala) 表示图(邻接列表)?

    我想知道如何 如果可能的话 我可以通过以下方式制作 可变 图的邻接列表表示HashMap Int Vector Int HashMap当然是可变的 目前我将其设置为HashMap Int ArrayBuffer Int 但我可以更改 Arr
  • 具有更高含义的简单类型 (C++11)

    我经常遇到这样的情况 在我的 C C 11 代码中 我的类型基本上表现得像内置类型 或 基本简单 类型 例如std string 但这有一个意义 超出 32 位数字或一堆字符 我在互联网上没有找到任何有用的东西 因为我真的不知道要搜索什么术
  • 在 C++ 头文件中声明向量

    我在制作的 C 类的头文件中的向量声明时遇到一些问题 我的整个头文件如下所示 ifndef PERSON H define PERSON H include Message h include
  • 父进程和子进程如何进行信号量操作?

    semget 调用是否在父进程和子进程之间共享信号量 我有这段代码 对于相同的代码 我观察到如果父进程首先运行 子进程有时会获得更改后的信号量值 但是当子进程首先运行时 父进程似乎永远不会携带更改后的信号量 为什么会发生这种情况 谁能向我解
  • CMake 找不到请求的 Boost 库

    既然我已经浏览了其他人的解决方案几个小时 但找不到适合我的问题的正确答案 我想将我的具体问题带给您 我正在尝试使用 CMake 构建 vsomeip 为此 我之前构建了 boost 1 55 但是 我在 CMake 中收到以下错误 The
  • 抛出错误的分配

    我在尝试使用升压托管共享内存时收到 bad alloc 我从他们的快速指南中复制了升压示例 以供不耐烦的人使用 并结合了我自己的更改 我的代码如下 我注释掉了示例内容并在下面编写了自己的代码 我还进行了一些调试和测试 有人有什么想法吗 任何
  • 在类中创建向量然后在函数中使用类对象不起作用

    我有课Employees 我试图让用户插入和删除员工 但它不起作用 向量的大小应为 500 class Employees public int maxx 500 vector
  • 使用 Boost Graph 顶点属性进行动态分配

    我正在使用 Boost Graph 库来读取 GraphML 文件 我想做的是使用图形管理的 Boost 功能来创建我自己的动态分配对象结构 以便我可以在其上运行我的自定义算法 struct VertexProperties std str
  • 使用 gtest 模拟 boost 共享内存派生类

    我有一个简单的 CPP 类 存储项目的一些配置 此类使用 boost 进程间共享内存进行存储 因此可以从我的服务器上运行的不同进程进行访问 现在 我想对我的程序运行一些测试 所以我想模拟我的共享内存对象的功能 为了使用 gtest 做到这一
  • boost变体简单调用常用方法

    我有两个指针 只能设置其中之一 所以我正在考虑使用 boost variant 例如 boost variant
  • r - 根据第一个向量重新排序第二个向量

    寻找解决方案来执行以下操作 有两个向量 a lt c 2 1 3 4 7 6 5 9 8 10 b lt c 3 2 1 6 5 4 7 8 9 10 我想创建第三个向量 它给出向量的顺序b需要重新排序 使其顺序与a 在这种情况下我想得到
  • 语言混合:模型和视图

    考虑开发一个应用程序 其中模型将使用 C 使用 Boost 编写 视图将使用 Objective C 使用 Cocoa Touch 编写 哪里有一些示例展示了如何集成 C 和 Objective C 来开发 iPhone 应用程序 直接从源
  • 带有接收器的 boost_log 示例无法编译

    我正在考虑将 boost log 用于一个项目 一开始我就遇到了以下问题 我在以下位置找到的升压日志示例 http www boost org doc libs 1 54 0 libs log example doc tutorial fi
  • 提升序列化 - 序列化 std::tr1::shared_ptr?

    Boost Serialization 具有内置支持boost shared ptr lt gt 有没有办法利用这种支持std tr1 shared ptr lt gt too 是否可以从std tr1 shared ptr lt gt t
  • 在 clang 中向量化函数

    我正在尝试根据此用 clang 对以下函数进行矢量化铿锵参考 http llvm org docs Vectorizers html 它采用字节数组向量并根据以下条件应用掩码this RFC https www rfc editor org
  • 如何组合输出流,以便输出同时到达多个位置?

    我想将两个 或更多 流合成为一个 我的目标是任何输出都指向cout cerr and clog也可以与原始流一起输出到文件中 例如 当事情记录到控制台时 关闭后 我仍然希望能够返回并查看输出 我正在考虑做这样的事情 class stream
  • Vector.erase(Iterator) 导致内存访问错误

    我正在尝试对以下内容进行 Z 索引重新排序videoObjects存储在一个vector 该计划旨在确定videoObject这将被放在第一个位置vector 将其删除 然后插入到第一个位置 不幸的是erase 函数总是会导致内存访问错误
  • R 将向量重塑为多列

    假设我在 R 中有一个向量 如下所示 d lt seq 1 100 我想将这个向量重塑为 10x10 矩阵 这样我就可以得到以下数据 1 2 3 10 1 2 3 10 11 12 13 20 21 22 23 30 91 92 93 10
  • boost 构建中缺少头文件

    我从 github 存储库克隆了当前的 boost 源 https github com boostorg boost https github com boostorg boost包括所有引用的子存储库 我使用最新的 XCode 命令行工
  • 在 C++ 中运行 python [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个用 C 编写的应用程序和一个测试系统 也是用 C 编写的 测试系统非常复杂并且很难改变 我只想做一些小的改变 我的班级是这样的

随机推荐

  • 递归字符串反转函数

    出于好奇编写了一个递归字符串反转函数 但是那里的 XOR 有点问题 这个函数的重点是不使用迭代器 这就是它是递归函数的原因 这不是作业 只是好奇心 private static char ReverseNL char arr int ind
  • IOError:[Errno 24]打开的文件太多:

    我有一个巨大的文件 我正在将其写入大约 450 个文件 我收到错误为too many files open 我在网上搜索并找到了一些解决方案 但没有帮助 import resource resource setrlimit resource
  • 在 ie8 及以下版本上使用 twitter bootstrap 的 Respond.js

    我正在使用 twitter bootstrap 实现一个响应式网站 但在 iexplorer 8 及更低版本上无法使用媒体查询 我为 try respond js 创建了一个简单的示例 但媒体查询在 iexplorer 7 8 上仍然无法工
  • libvirtError:XML 错误:预期单播 mac 地址,发现多播

    我正在通过 ansible 设置 KVM 自动化 并且我有一个虚拟机一直给我这个错误 libvirtError XML 错误 预期的单播 mac 地址 发现多播 53 54 00 b4 ad 81 我不认为这是一个可靠的问题 因为其他几个虚
  • 图像尺寸突然缩小

    我只是复制图像并将其保存到当前目录中的另一个临时文件夹中 没有任何修改 但图像大小以某种方式减小了 为什么 from PIL import Image import os image path Users moomoochen Deskto
  • 两个数相除总是等于零?

    在我的 Xna 游戏中 我试图将我的游戏场缩放到它运行的屏幕上 为此 我使用比例来查找实际窗口相对于我的游戏区域缩放的百分比 为此 我将实际宽度除以虚拟宽度 float percent realViewport Width this vie
  • 如何从joomla模块中的ajax获取数据库值?

    我正在创建一个模块 我想从 ajax 获取数据库值 任何人有这个问题的解决方案或任何例子请帮助我 谁能给我一个正确的方法来解决这个问题 这是我的jquery code jQuery type bind click function var
  • 使用 std::tr1::function (或 boost::function)创建多播事件

    我正在尝试使用 TR1 的功能创建类似 C 的多播委托和事件 或者 Boost 因为 boost function 大部分 与 std tr1 function 相同 作为概念证明 我尝试了以下方法 template
  • wxPython 带有面板的框架的最小尺寸

    wxpython 2 8 11 0 python 2 7 如果我放一些Sizer一些控件直接进入Frame like import wx app wx App frm wx Frame None title title sizer wx B
  • 如何检查一个数组中的任何变量是否在另一个数组中

    我正在使用 MatLab 开发一个程序 该程序计算数字的幂 将它们加在一起 然后查看第一组数字 数字的幂 是否等于任何相加的数字的幂 我试图检查第一个数组中的每个值 但是 我得到如下输出 m 1 128 2187 16384 78125 2
  • Netsuite suitetalk 交易电子邮件,带有 pdf 附件介绍文本

    我使用 php 工具包和 netsuite 来添加带有 toBeEmailed 选项的销售订单 并且它登录的 api 用户具有首选项 交易电子邮件附件格式 gt PDF 这会将订单摘要制作为 pdf 并附加到电子邮件中并作为通知发送 我查看
  • Windows MessageBox 忽略 WM_CLOSE

    我们有一个遗留的 C Windows 应用程序 当发生致命连接错误时 它会通过 MessageBox 调用弹出一个模式窗口 我们的网络工程师可能会同时运行许多这样的应用程序 有时 网络故障会导致这些应用程序处理的连接同时失败 在 Windo
  • 从数组中删除重复项

    您好 我有一个使用此函数从 XML 文件创建的数组 LOCATIONS XML HANDLER creates array holding values of field selected from XML string xml param
  • 是否可以从 android 调用 WSHTTPBINDING?

    private static final String SOAP ACTION http tempuri org IService1 HelloTest private static final String METHOD NAME Hel
  • 如何使用 C# 禁用文本框上的复制、粘贴和删除功能

    有人可以建议如何使用 C 处理 WinForms 中文本框上的剪切 复制和粘贴事件吗 在 WinForms 中 禁用文本框上的剪切 复制和粘贴功能的最简单方法是将 ShortcutsEnabled 属性设置为 false
  • 如何在 MDX 中使用 UNION

    我想要UNION下面MDX询问 对于这两个查询 同一日期范围的度量和维度是不同的 请帮助我摆脱困境 SELECT NON EMPTY Measures Number of es2 ON COLUMNS NON EMPTY Date Year
  • 如何按升序对奇数数组进行排序,但将偶数保留在其位置?

    我只想对奇数进行排序而不移动偶数 例如 当我写 sortArray 5 3 2 8 1 4 预期结果是 1 3 2 8 5 4 我是 JavaScript 新手 在互联网上遇到了一个令我困惑的挑战 我通常不会在互联网上发布请求解决方案 但我
  • 带yield的递归函数不返回任何内容

    我正在尝试创建一个用于排列目的的生成器 我知道在 Python 中还有其他方法可以做到这一点 但这是为了别的事情 不幸的是 我无法产生这些值 你能帮我吗 def perm s p 0 ii 0 l len s s list s if l 1
  • HTML5 音频加载

    当音频标签准备好播放时如何获得回调 在实现我自己的控件时告诉用户 使用 Chrome 仅在视频元素上执行此操作 但它应该适用于音频 首先 你不能绑定事件 我不知道为什么这不起作用 所以必须使用setTimeout 使用 jQuery 的示例
  • boost 中的共享内存向量

    我有以下代码 尝试拥有一个具有字符串和数组结构的共享内存向量 但是当我编译代码时出现错误 usr local include boost container vector hpp 1819 4 error no matching funct