面试题答案
一键面试- 获取共享内存中的结构体指针:
- 在释放共享内存前,首先要获取指向共享内存中
SharedStruct
结构体的指针。假设已经通过shmat
等函数将共享内存映射到进程地址空间,得到了指针SharedStruct *sharedPtr
。
- 在释放共享内存前,首先要获取指向共享内存中
- 释放动态分配的内存:
- 如果在一个进程中为
sharedPtr->str
分配了额外的内存(假设是通过malloc
等函数),则需要在释放共享内存前,对这部分动态分配的内存进行释放。例如,如果sharedPtr->str
是通过malloc
分配的,代码如下:
- 如果在一个进程中为
if(sharedPtr->str!= NULL) {
free(sharedPtr->str);
sharedPtr->str = NULL;
}
- 解除共享内存映射并释放共享内存标识符:
- 在释放完结构体中动态分配的内存后,使用
shmdt
函数解除共享内存与进程地址空间的映射:
- 在释放完结构体中动态分配的内存后,使用
shmdt(sharedPtr);
- 最后,使用
shmctl
函数并指定IPC_RMID
命令释放共享内存标识符:
shmctl(shmid, IPC_RMID, NULL);
- 其中
shmid
是共享内存标识符,在创建共享内存时得到。
这样就可以正确地释放结构体中动态分配的内存,并避免内存泄漏,同时正确释放共享内存资源。