将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 = new(&pShmDataAddr[i])TData();
if (INIT_MODE == mode)
{
// 初次创建共享内存
pData->Init();
}
else if (RESUME_MODE == mode)
{
// 未清共享内存拉起程序
pData->Resume();
}
}
在这种方式下,注意TData构造函数不应该进行对象创建时的初始化操作(因为恢复共享内存中C++对象时也会调用TData构造函数),而应该将初始化操作放在成员函数Init中。未清共享内存拉起程序时的指针变量等的恢复则放在成员函数Resume中。
原文地址:http://www.cnblogs.com/yangru/p/3805192.html