我正在尝试使用一个函数:
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 中的进程(与系统 v)之间使用共享内存。
所以我这样调用 Attach():
void *ptr_shared;
mem.Attach(&ptr_shared);
我目前的理解:
- **无效地址是指向指针(*地址)的指针。
- *address 是 shmat() 指向共享内存块的指针。
- 因此,如果我想为该内存块分配一个值(当我创建 Mem 对象时,我得到的密钥是单个 int 块的),我想更改 *ptr_shared 指向的值。
但是如果我尝试这样做,请说:
*ptr_shared = 42;
然后我得到一个SIGSEGV错误。
怎么了?是我对指针的理解还是我尝试使用系统 v 的方式有问题?
编辑:遵循迈尔斯的评论(以及约翰的评论)。如果我想改为附加返回指向共享内存段的指针......我将如何管理其类型?当我创建共享内存段时,我使用了 int 的大小。这意味着我绝对必须只将 int 分配给该段,因此返回的指针类型必须是 int?但是,可以创建其他内存段以包含字符...那么在这种情况下,我如何管理来自 Attach() 的未知类型的返回指针,这取决于 mem 段的大小?
我来自 Python 背景,所以我们不怎么做类型......
如果我想改为附加返回指向共享内存段的指针......我将如何管理其类型?当我创建共享内存段时,我使用了 int 的大小。这意味着我绝对必须只将 int 分配给该段,因此返回的指针类型必须是 int?但是,可以创建其他内存段以包含字符...那么在这种情况下,我如何管理来自 Attach() 的未知类型的返回指针,这取决于 mem 段的大小?
只要有足够的内存来保存其数据,就可以将指针强制转换为任何序号类型:
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
这样的强制转换为动态类型会以糟糕的方式结束。