From da946e1c4dfa53c887cfc700781d94e238abdc81 Mon Sep 17 00:00:00 2001 From: gaorui Date: Mon, 8 Dec 2025 14:52:32 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=B4=A9=E6=BA=83=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared_memory/shared_memory.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) 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); } }