MST

星途 面试题库

面试题:C语言Linux消息队列消息格式的内存管理

在C语言开发的Linux消息队列程序里,若消息格式定义了复杂的数据结构,如何有效地管理消息内存以避免内存泄漏,特别是在消息发送和接收的过程中,请举例说明。
29.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 动态内存分配与释放原则
    • 在C语言中,对于复杂数据结构的消息,通常使用malloc系列函数来分配内存。在消息发送完成或接收处理完毕后,需要及时使用free函数释放内存,以避免内存泄漏。
  2. 发送端内存管理示例
    • 假设定义如下复杂消息结构:
#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;
}
  1. 接收端内存管理示例
#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;
}
  1. 注意事项
    • 确保在所有可能的代码路径中都正确释放内存。例如,在发送或接收函数出错返回时,也要释放已分配的内存。
    • 如果消息结构中有指针成员指向动态分配的内存,在释放结构体本身之前,要先释放这些指针指向的内存,以避免内存泄漏。例如:
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);