我正在尝试使用一个函数:
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);
我目前的理解:
但是,如果我尝试这样做,请说:
*ptr_shared = 42;
然后我收到了SIGSEGV错误。
怎么了?是我对指针的理解还是我试图使用系统v的问题?
编辑:遵循Miles的评论(和John的评论)。如果我想改为使用Attach返回指向共享内存段的指针...我将如何管理其类型?创建共享内存段时,我使用的是int的大小。所以...这意味着我绝对必须只将int分配给该段,因此返回的指针类型必须为int?但是,可能会创建其他内存段来包含字符...因此,在这种情况下,如何管理Attach()中依赖于内存段大小的未知类型的返回指针?
我来自Python背景,所以我们不会做太多类型的事情。...
答案 0 :(得分:0)
如果我想改为附加以返回指向共享内存段的指针...我将如何管理其类型?创建共享内存段时,我使用的是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
)会很糟糕。