c++ - 使用 void 指针:void **ptr... 如何修改共享内存的值?
问题描述
我正在尝试使用一个功能:
void Mem::Attach(void **address)
{
*address = NULL;
if ((*address = shmat(memid, *address, 0)) == (void *) -1)
perror(" stuff .... ");
}
共享内存类:
class Mem {
private:
int memid;
public:
Mem(key_t key, int dimension);
void Attach(void **adress);
void Detach(char *adress);
void Libere();
};
所以本质上这是一个在Linux(使用system v)进程之间使用共享内存的包装器。
所以我这样调用 Attach() :
void *ptr_shared;
mem.Attach(&ptr_shared);
我目前的理解:
- **void address 是指向指针 ( *address ) 的指针。
- *address 是 shmat() 将指向共享内存块的指针。
- 因此,如果我想为该内存块分配一个值(当我创建 Mem 对象时,我得到的键是单个 int 的块),我想更改 *ptr_shared 指向的值。
但是,如果我尝试这样做,请说:
*ptr_shared = 42;
然后我收到一个 SIGSEGV 错误。
怎么了?是我对指针的理解还是我尝试使用system v的问题?
编辑:遵循迈尔斯的评论(在一定程度上和约翰的评论)。如果我想改为 Attach 返回指向共享内存段的指针......我将如何管理它的类型?当我创建共享内存段时,我使用了 int 的大小。所以...这意味着我绝对必须只将 int 分配到该段中,因此返回的指针类型必须是 int?但是,可能会创建其他内存段来包含字符......所以在这种情况下,我如何管理来自 Attach() 的未知类型的返回指针,这取决于内存段的大小?
我来自 Python 背景,所以我们不做太多类型....
解决方案
如果我想改为 Attach 返回指向共享内存段的指针......我将如何管理它的类型?当我创建共享内存段时,我使用了 int 的大小。所以...这意味着我绝对必须只将 int 分配到该段中,因此返回的指针类型必须是 int?但是,可能会创建其他内存段来包含字符......所以在这种情况下,我如何管理来自 Attach() 的未知类型的返回指针,这取决于内存段的大小?
只要有足够的内存来保存其数据,您就可以将指针转换为任何序数类型:
void *ptr_shared;
mem.Attach(&ptr_shared);
char* someData = reinterpret_cast<char*>(ptr_shared);
*someData = 'f';
++someData;
int* otherData = reinterpret_cast<int*>(someData);
*otherData = 11;
然而,转换为动态类型std::vector
会很糟糕。
推荐阅读
- python - 如何为命令行脚本组织一个带有诗歌的python项目
- powershell - PowerShell - 通过将参数传递给 Select-Object,从多个制表符/CSV 分隔文件中获取基于多列的唯一行
- .net - 如何将具有日期时间模式的字符串映射到打字稿日期对象
- bash - 使用 vim 和 screen
- ios - 如何快速将数据从视图控制器传递到容器视图
- django - 确保数据位于 django 模板中正确的 tabe 列中
- php - 在所有运输方式名称前添加 WooCommerce 品牌名称
- angular - 角材料微调器不旋转
- jquery - JQuery获取所有选定单选按钮的列表
- javascript - 是什么导致此代码段中的“Javascript 错误(意外令牌)”?