MST

星途 面试题库

面试题:C语言中结构体共享内存释放问题

假设有如下结构体定义:typedef struct { int data; char str[10]; } SharedStruct; 两个进程通过共享内存使用这个结构体,其中一个进程对共享内存中的结构体进行了动态内存分配(例如为str分配了额外内存),请描述在释放共享内存时,如何正确使用free函数释放结构体中动态分配的内存,以避免内存泄漏?
22.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

这样就可以正确地释放结构体中动态分配的内存,并避免内存泄漏,同时正确释放共享内存资源。