diff --git a/shared_memory/shared_memory.c b/shared_memory/shared_memory.c index c5fba43..c149318 100755 --- a/shared_memory/shared_memory.c +++ b/shared_memory/shared_memory.c @@ -148,11 +148,14 @@ void shm_detach_only(SharedMem *shm) { shmdt(shm); // 仅分离,不删除 } -// 销毁共享内存(父进程用,删除内核资源) +// 修复后的 shm_destroy 函数 void shm_destroy(SharedMem *shm) { if (shm == NULL) return; - // 1. 分离共享内存 + // 关键:先保存sem_id到临时变量(在shmdt之前) + int sem_id_temp = shm->sem_id; + + // 1. 分离共享内存(分离后shm指针失效,不可再访问) shmdt(shm); // 2. 删除共享内存(检查资源是否存在) @@ -161,9 +164,9 @@ void shm_destroy(SharedMem *shm) { shmctl(shm_id, IPC_RMID, NULL); } - // 3. 删除信号量(检查资源是否存在) - if (shm->sem_id != -1) { - semctl(shm->sem_id, 0, IPC_RMID); + // 3. 删除信号量(用临时变量判断,避免访问失效的shm指针) + if (sem_id_temp != -1) { + semctl(sem_id_temp, 0, IPC_RMID); } }