- 动态内存分配与释放原则
- 在C语言中,对于复杂数据结构的消息,通常使用
malloc
系列函数来分配内存。在消息发送完成或接收处理完毕后,需要及时使用free
函数释放内存,以避免内存泄漏。
- 发送端内存管理示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// 定义消息结构
typedef struct {
long mtype;
char data[100];
int num;
// 可以有更复杂的嵌套结构等
} Message;
int main() {
key_t key = ftok(".", 'a');
int msgid = msgget(key, IPC_CREAT | 0666);
if (msgid == -1) {
perror("msgget");
return 1;
}
// 动态分配消息内存
Message *msg = (Message *)malloc(sizeof(Message));
if (msg == NULL) {
perror("malloc");
return 1;
}
msg->mtype = 1;
strcpy(msg->data, "Hello, message queue");
msg->num = 42;
if (msgsnd(msgid, msg, sizeof(Message) - sizeof(long), 0) == -1) {
perror("msgsnd");
}
// 发送完成后释放内存
free(msg);
// 如果不再使用消息队列,可以删除
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
}
return 0;
}
- 接收端内存管理示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// 定义消息结构
typedef struct {
long mtype;
char data[100];
int num;
// 可以有更复杂的嵌套结构等
} Message;
int main() {
key_t key = ftok(".", 'a');
int msgid = msgget(key, 0666);
if (msgid == -1) {
perror("msgget");
return 1;
}
// 动态分配消息内存
Message *msg = (Message *)malloc(sizeof(Message));
if (msg == NULL) {
perror("malloc");
return 1;
}
if (msgrcv(msgid, msg, sizeof(Message) - sizeof(long), 1, 0) == -1) {
perror("msgrcv");
}
printf("Received data: %s, num: %d\n", msg->data, msg->num);
// 处理完成后释放内存
free(msg);
return 0;
}
- 注意事项
- 确保在所有可能的代码路径中都正确释放内存。例如,在发送或接收函数出错返回时,也要释放已分配的内存。
- 如果消息结构中有指针成员指向动态分配的内存,在释放结构体本身之前,要先释放这些指针指向的内存,以避免内存泄漏。例如:
typedef struct {
long mtype;
char *str;
int num;
} ComplexMessage;
// 分配内存
ComplexMessage *cm = (ComplexMessage *)malloc(sizeof(ComplexMessage));
cm->str = (char *)malloc(100);
// 使用后释放内存
free(cm->str);
free(cm);