Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost共享内存对象中的指针_C++_Pointers_Boost_Shared Memory - Fatal编程技术网

C++ boost共享内存对象中的指针

C++ boost共享内存对象中的指针,c++,pointers,boost,shared-memory,C++,Pointers,Boost,Shared Memory,我正在处理boost::进程间::共享内存\u对象,我试图实现的是这样的 我定义了自己的类,名为SharedMemory,其中有一个方法 调用了创建内存块的CreateSharedMemory()。我需要在这个内存块中保留三个数组fooa1[SIZE]、fooa2[SIZE]和fooa3[SIZE],以便我可以一致地将数据写入它们Foo是我自己定义的类。要访问这三个阵列,我需要在进程中获取它们的地址。所以我将三个指针Foo*p1、*p2、*p3传递给这个方法来记录它们的地址。这个方法一切顺利,但

我正在处理
boost::进程间::共享内存\u对象
,我试图实现的是这样的

我定义了自己的类,名为
SharedMemory
,其中有一个方法 调用了创建内存块的
CreateSharedMemory()
。我需要在这个内存块中保留三个数组
fooa1[SIZE]、fooa2[SIZE]
fooa3[SIZE]
,以便我可以一致地将数据写入它们
Foo
是我自己定义的类。要访问这三个阵列,我需要在进程中获取它们的地址。所以我将三个指针
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.h
福班
{
双f[最大尺寸];
字符c[最大大小];
}
//SharedMemory.cpp
void SharedMemory::CreateSharedMemory(Foo*p1、Foo*p2、Foo*p3)
{
boost::进程间::共享内存\u对象shm
(boost::进程间::仅创建_)
,“foo”//name
,boost::进程间::读写
);
shm.截断(块大小);
//在此过程中映射整个共享内存
boost::进程间::映射的_区域(shm,boost::进程间::读_写);
//将所有内存写入0
memset(region.get_address(),0,region.get_size());
//分配地址
p1=静态_cast(region.get_address());
p2=静态_cast(region.get_address()+blockSize/3);
p3=静态_cast(region.get_address()+2*blockSize/3);
//p1、p2、p3指向此处的正确地址
}
//p1、p2、p3一旦跳出CreateSharedMemory()就指向错误的地址

必须传递对Foo指针的引用。比如:

void SharedMemory::CreateSharedMemory(Foo* & p1, Foo* & p2, Foo* &p3)