मेरे पास cJSON पॉइंटर्स के साथ एक संरचना है:

  struct { 

      cJSON *myJSON1;
      cJSON *myJSON2;
      ...
  } myStruct;

मेरे कोड में कहीं भी मैं cJSON आइटम बना देता हूं जैसे myStruct.myJSON1 = cJSON_CreateObject ()

कोड के अंत में, मैं उन पॉइंटर्स पर cJSON_Delete() को कॉल करना चाहता हूं जिन्हें असाइन किया गया था। मुझे लगता है कि यह क्लासिक सी केस है जहां यह पता लगाने का कोई तरीका नहीं है कि पॉइंटर को किसी तरह से मॉलोक किया गया था या नहीं। बेशक, मैं ट्रैक रखने के लिए एक झंडा रख सकता हूं लेकिन मुझे एक आसान तरीका चाहिए। मैंने पढ़ा है...

सीजेएसओएन संरचना इस प्रकार है:

  /* The cJSON structure: */
  typedef struct cJSON
  {
      struct cJSON *next;
      struct cJSON *prev;
      struct cJSON *child;
      int type;
      char *valuestring;
      /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
      int valueint;
      double valuedouble;
      char *string;
  } cJSON;

फ़ंक्शन cJSON_Invalid() उपलब्ध है। दस्तावेज़ कहता है "(cJSON_IsInvalid के साथ जांचें): एक अमान्य आइटम का प्रतिनिधित्व करता है जिसमें कोई मान नहीं होता है। यदि आप आइटम को सभी शून्य बाइट्स पर सेट करते हैं तो आपके पास स्वचालित रूप से यह प्रकार होता है।" क्या मुझे संरचना को 0 पर याद करना है या बस टाइप करना है?

दूसरे शब्दों में, मेरा प्रश्न है: यह जांचने का सबसे आसान तरीका क्या होगा कि एक अतिरिक्त चर बनाए बिना cJSON सूचक को मॉलोक किया गया है या नहीं? शायद "टाइप" को शून्य पर सेट करें? मैं ऐसे विकल्पों को आजमा सकता हूं लेकिन मुझे एक निश्चित उत्तर चाहिए जो सभी परिस्थितियों में काम करे।

1
asinix 17 जिंदा 2020, 19:18

1 उत्तर

सबसे बढ़िया उत्तर

यदि आपके पास cJSON डेटा संरचना के लिए एक प्रारंभिक सूचक है तो व्यवहार अपरिभाषित है। अर्थात। cJSON *myJSON1; के लिए

cJSON_Invalid(myJSON1), 0 या 1 वापस आ सकता है।

और cJSON_Delete(myJSON1) शायद segfault होगा। या किस्मत अच्छी हो तो कुछ न करें।

समाधान हमेशा cJSON डेटा संरचनाओं को NULL में प्रारंभ करना है। तब आप केवल cJSON_Delete() पर कॉल कर सकते हैं। यदि सूचक अभी भी NULL है, तो कॉल कुछ नहीं करेगी। यदि इसे आपके प्रोग्राम में किसी बिंदु पर स्थापित किया गया था तो यह सभी मेमोरी को सही ढंग से रिलीज़ कर देगा। चूंकि आपके पास कई cJSON पॉइंटर्स की संरचना है, इसलिए आप मेमसेट का उपयोग करके संपूर्ण डेटा संरचना को 0 पर सेट कर सकते हैं।

आप स्रोत कोड पर एक नज़र डाल सकते हैं।

CJSON_PUBLIC(void) cJSON_Delete(cJSON *item)
{
    cJSON *next = NULL;
    while (item != NULL)
    {
    ...
    }
}
1
hko 22 जिंदा 2020, 02:14