首页 > 代码库 > 将C++对象保存到共享内存上

将C++对象保存到共享内存上

     将C++对象保存到共享内存上时,由于程序DWON掉或者其他原因停掉程序(不清除共享内存)重新拉起程序时,共享内存上C++对象的虚函数指针已经失效。为了使得不清除共享内存重启程序时C++对象仍然有效,需要恢复共享内存上C++对象的虚函数表,通过C++的placement new可以做到。

     假设 void *pShmDataAddr是挂载后的共享内存地址,TData是存放的C++对象,共享内存上总共存放了MAX_OBJ_NUM个对象。具体做法如下。

当程序启动的时候执行操作:

    TData *pShmDataAddr = (TData *)pShmDataAddr;

    for (int i=0; i<MAX_OBJ_NUM; ++i)

    {

          TData *pData = http://www.mamicode.com/new(&pShmDataAddr[i])TData();

          if (INIT_MODE ==  mode)

         {

              // 初次创建共享内存

              pData->Init();

         }

         else if (RESUME_MODE == mode)

          {

               // 未清共享内存拉起程序

               pData->Resume();

           }

     }

      在这种方式下,注意TData构造函数不应该进行对象创建时的初始化操作(因为恢复共享内存中C++对象时也会调用TData构造函数),而应该将初始化操作放在成员函数Init中。未清共享内存拉起程序时的指针变量等的恢复则放在成员函数Resume中。