將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中。
