2012-01-05 38 views
6

Tôi mới dùng JSON-C, Vui lòng xem mã mẫu của tôi và cho tôi biết nó sẽ tạo ra bất kỳ rò rỉ bộ nhớ nào, nếu có thì làm thế nào để giải phóng đối tượng JSON-C.Rò rỉ bộ nhớ Sử dụng JSON-C

struct json_object *new_obj   = NULL; 
    new_obj = json_tokener_parse(strRawJSON); 
    new_obj = json_object_object_get(new_obj, "FUU"); 
    if(NULL == new_obj){ 
     SYS_OUT("\nFUU not found in JSON"); 
     return NO; 
    } 
    new_obj = json_object_object_get(new_obj, "FOO"); // I m re-using new_obj, without free it? 
    if(NULL == new_obj){ 
     SYS_OUT("\nFOO not found in JSON"); 
     return NO; 
    } 
    // DO I need to clean new_obj, if yes then how ?? 

Tôi có cần làm sạch new_obj, nếu có thì làm cách nào. Có thể ai đó giúp hiểu cách quản lý bộ nhớ JSON-C.

Cảm ơn trước Advance

+0

Tìm kiếm trên web nhanh có vẻ chỉ ra rằng JSON-C sử dụng tính toán tham chiếu để quản lý các trường hợp 'json_object' và hàm được sử dụng để" miễn phí "các trường hợp là [json_object_put] (http://oss.metaparadigm.com/json- c/doc/html/json__object_8h.html # a15). – hmjd

Trả lời

7

KHÔNG, Chúng ta cần gọi json_object_put chỉ một lần cho đối tượng gốc miễn là chúng tôi không phân bổ bộ nhớ một cách rõ ràng cho đối tượng json và điều này làm việc cho tôi ..... !!

5

Vâng, tôi tin rằng mã của bạn sẽ bị rò rỉ bộ nhớ. Vấn đề là bạn đang ghi đè lên con trỏ new_obj của bạn nhiều lần. Mã của bạn phải giống như sau:

struct json_object *new_obj, *fuu_obj, *foo_obj; 
new_obj = json_tokener_parse(strRawJSON); 
fuu_obj = json_object_object_get(new_obj, "FUU"); 
if(NULL == new_obj){ 
    SYS_OUT("\nFUU not found in JSON"); 
    return NO; 
} 
foo_obj = json_object_object_get(new_obj, "FOO"); 
if(NULL == new_obj){ 
    SYS_OUT("\nFOO not found in JSON"); 
    return NO; 
} 
json_object_put(foo_obj); 
json_object_put(fuu_obj); 
json_object_put(new_obj); 

Vui lòng cho tôi biết nếu điều này phù hợp với bạn. Nếu bạn muốn được trợ giúp thêm, json-c có chế độ đếm tham chiếu có thể cung cấp cho bạn thêm thông tin về các đối tượng. Hãy cho tôi biết và tôi có thể giải thích thêm về điều này.

+3

KHÔNG, Chúng ta cần phải gọi json_object_put chỉ một lần cho đối tượng gốc miễn là chúng ta không phân bổ bộ nhớ một cách rõ ràng cho đối tượng json và điều này làm việc cho tôi ..... !! –

+0

Có thực sự bạn là đúng. Bạn chỉ cần gọi một lần cho đối tượng gốc! – portforwardpodcast