C : 如何优化给定 c 程序的内存消耗?

C : How to optimise the memory consumption of the given c program?

我有一个 c 程序,它通过 MQTT 发送每个偶数索引上的数据,发送数据后,框架 json 被清除并开始构建新的并重复该过程。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#include <jansson.h>

char *jsonString;


void sendMQTT(char *jsonString){
    
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    MQTTClient_message pubmsg = MQTTClient_message_initializer;
    MQTTClient_deliveryToken token;
    int rc;

    MQTTClient_create(&client, "tcp://localhost:1883", "client-pub",
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;

    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
    printf("Inside MQTT :: %s\n", jsonString);
    pubmsg.payload = jsonString;
    pubmsg.payloadlen = (int)strlen(jsonString);   
    pubmsg.qos = 1;
    pubmsg.retained = 0;
    
    MQTTClient_publishMessage(client, "mqtt-ex", &pubmsg, &token);
    rc = MQTTClient_waitForCompletion(client, token, 10000L);
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);

}


int main() {  
    json_t *root = json_object();
    char myNum[10] = {1, 2, 3, 4, 6, 7, 12, 16, 32, 24};
    
    for(int i=0; i<10;i++)
    {   
        int json_size = json_object_size(root);
        if(i%2==0 && json_size !=0)
        {    
            jsonString = json_dumps(root, 0);
            sendMQTT(jsonString);
            json_object_clear(root);
            free(jsonString);
        }
        

    char key[8];
    snprintf(key, sizeof(key), "%d", myNum[i]);
    
    json_object_set_new( root, key, json_integer(i));      

  }  
}

当我 运行 这个过程大约 2 小时后,空闲内存几乎耗尽,当我连续 运行 读取空闲内存 2 小时后,它结束最多 2 MB。

> show system cpu
Status='0,Success'
TotalMemory='62304256'
FreeMemory='3239936'
CPUUtilization='29'

而在开始上述过程之前,可用内存为 17 MB。如何优化上面给定程序中的内存消耗?

json_dumps 的文档指出

The return value must be freed by the caller using free().

由于您从不调用 free(jsonString);,因此会导致内存泄漏,这可以解释您的内存问题(因为您在循环中调用 json_dumps