我已经读过stl向量与SYS V共享内存不兼容。但是如果我使用POSIX shm_open然后使用带有NULL的mmap(mmap(NULL,LARGE_SIZE,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0)并提供比我的对象(包含我的向量)大得多的大小,并且在映射之后添加aditional项目向量,除了超出LARGE_SIZE空间之外是否还有其他问题?其他相关问题:在最近的SUSE linux上保证当在不相关的进程中映射到相同的起始地址(使用上面的语法)时,我的对象将被直接映射,不执行(系统)复制以实现进程中的更改值(如mmap-ed时正常打开和普通文件会发生什么情况)? 谢谢!
编辑: 这是正确的吗?:
void* mem = allocate_memory_with_mmap(); // say from a shared region
MyType* ptr = new ( mem ) MyType( args );
ptr.~MyType() //is this really needed?
现在处于一个不相关的过程中:
MyType* myptr = (MyType*)fetch_address_from_mmap(...)
myptr->printHelloWorld();
myptr->myvalue = 1; //writes to shared memory
myptr.~MyType() //is this really needed?
现在如果我想释放内存
munmap(address...) //but this done only once, when none of the processes use it any more
答案 0 :(得分:3)
您错过了STL向量通常只是(mem pointer, mem size, element count)
元组的事实,其中包含对象的实际内存是从allocator
模板参数接收的。
将std::vector
的实例放在共享内存中没有任何意义。您可能想要查看boost::interprocess
库。
内存分配和对象构造是两个截然不同的阶段,但是在像bellow这样的单个语句中组合(除非为new
重新定义了运算符MyType
):
// allocates from process heap and constructs
MyType* ptr = new MyType( args );
您可以使用placement new分割这两个阶段:
void* mem = allocate_memory_somehow(); // say from a shared region
MyType* ptr = new ( mem ) MyType( args );
虽然现在你必须显式调用析构函数并释放内存:
ptr->~MyType();
release_memory_back_to_where_it_came_from( ptr );
这实际上是如何在C ++中用共享内存构造对象的。请注意,存储指针的类型不适合共享内存,因为一个进程内存空间中的任何指针在另一个进程内存空间中没有任何意义。请改用显式尺寸和偏移量。
希望这有帮助。