boost 共享内存对象中的指针
pointer in boost shared memory object
我正在处理 boost::interprocess::shared_memory_object
我正在努力实现的目标是这样的。
我定义了我自己的 class 叫做 SharedMemory
并且里面有一个方法
称为 CreateSharedMemory()
,它创建一个内存块。我需要在这个内存块中保留三个数组 Foo a1[SIZE], Foo a2[SIZE]
和 Foo a3[SIZE]
以便我可以一致地将数据写入它们。 Foo
是我自己定义的class。要访问这三个数组,我需要在我的进程中获取它们的地址。所以我把三个指针Foo *p1, *p2, *p3
传递给这个方法来记录它们的地址。在这个方法中一切顺利,但是一旦它退出这个方法,p1, p2, p3
指向错误的地址。有人可以帮忙吗?
// Foo.h
class Foo
{
double f[MAX_SIZE];
char c[MAX_SIZE];
}
// SharedMemory.cpp
void SharedMemory::CreateSharedMemory(Foo *p1, Foo *p2, Foo *p3)
{
boost::interprocess::shared_memory_object shm
(boost::interprocess::create_only
,"foo" //name
,boost::interprocess::read_write
);
shm.truncate(blockSize);
//Map the whole shared memory in this process
boost::interprocess::mapped_region region(shm, boost::interprocess::read_write);
//Write all the memory to 0
memset(region.get_address(), 0, region.get_size());
// assign address
p1 = static_cast<Foo *>(region.get_address());
p2 = static_cast<Foo *>(region.get_address() + blockSize / 3);
p3 = static_cast<Foo *>(region.get_address() + 2 * blockSize / 3);
// p1, p2, p3 point to the correct address here
}
// p1, p2, p3 point to the wrong address once it steps out CreateSharedMemory()
您必须传递对 Foo 指针的引用。喜欢:
void SharedMemory::CreateSharedMemory(Foo* & p1, Foo* & p2, Foo* &p3)
我正在处理 boost::interprocess::shared_memory_object
我正在努力实现的目标是这样的。
我定义了我自己的 class 叫做 SharedMemory
并且里面有一个方法
称为 CreateSharedMemory()
,它创建一个内存块。我需要在这个内存块中保留三个数组 Foo a1[SIZE], Foo a2[SIZE]
和 Foo a3[SIZE]
以便我可以一致地将数据写入它们。 Foo
是我自己定义的class。要访问这三个数组,我需要在我的进程中获取它们的地址。所以我把三个指针Foo *p1, *p2, *p3
传递给这个方法来记录它们的地址。在这个方法中一切顺利,但是一旦它退出这个方法,p1, p2, p3
指向错误的地址。有人可以帮忙吗?
// Foo.h
class Foo
{
double f[MAX_SIZE];
char c[MAX_SIZE];
}
// SharedMemory.cpp
void SharedMemory::CreateSharedMemory(Foo *p1, Foo *p2, Foo *p3)
{
boost::interprocess::shared_memory_object shm
(boost::interprocess::create_only
,"foo" //name
,boost::interprocess::read_write
);
shm.truncate(blockSize);
//Map the whole shared memory in this process
boost::interprocess::mapped_region region(shm, boost::interprocess::read_write);
//Write all the memory to 0
memset(region.get_address(), 0, region.get_size());
// assign address
p1 = static_cast<Foo *>(region.get_address());
p2 = static_cast<Foo *>(region.get_address() + blockSize / 3);
p3 = static_cast<Foo *>(region.get_address() + 2 * blockSize / 3);
// p1, p2, p3 point to the correct address here
}
// p1, p2, p3 point to the wrong address once it steps out CreateSharedMemory()
您必须传递对 Foo 指针的引用。喜欢:
void SharedMemory::CreateSharedMemory(Foo* & p1, Foo* & p2, Foo* &p3)