From 330cfc13bc587487fac0c51f65438152cb1f7361 Mon Sep 17 00:00:00 2001 From: Andrew McGeachie Date: Tue, 21 Jul 2009 14:33:17 +0000 Subject: [PATCH] THRIFT-59. Fix memory leak by releasing allocated objects after assigning to container. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@796320 13f79535-47bb-0310-9956-ffa450edef68 --- .../cpp/src/generate/t_cocoa_generator.cc | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/compiler/cpp/src/generate/t_cocoa_generator.cc b/compiler/cpp/src/generate/t_cocoa_generator.cc index aefb6a69..762c5b26 100644 --- a/compiler/cpp/src/generate/t_cocoa_generator.cc +++ b/compiler/cpp/src/generate/t_cocoa_generator.cc @@ -1443,15 +1443,25 @@ void t_cocoa_generator::generate_deserialize_map_element(ofstream& out, string fieldName) { string key = tmp("_key"); string val = tmp("_val"); - t_field fkey(tmap->get_key_type(), key); - t_field fval(tmap->get_val_type(), val); + t_type* keyType = tmap->get_key_type(); + t_type* valType = tmap->get_val_type(); + t_field fkey(keyType, key); + t_field fval(valType, val); generate_deserialize_field(out, &fkey, key); generate_deserialize_field(out, &fval, val); indent(out) << - "[" << fieldName << " setObject: " << containerize(fval.get_type(), val) << - " forKey: " << containerize(fkey.get_type(), key) << "];" << endl; + "[" << fieldName << " setObject: " << containerize(valType, val) << + " forKey: " << containerize(keyType, key) << "];" << endl; + + if (type_can_be_null(keyType)) { + indent(out) << "[" << containerize(keyType, key) << " release];" << endl; + } + + if (type_can_be_null(valType)) { + indent(out) << "[" << containerize(valType, val) << " release];" << endl; + } } /** @@ -1461,12 +1471,17 @@ void t_cocoa_generator::generate_deserialize_set_element(ofstream& out, t_set* tset, string fieldName) { string elem = tmp("_elem"); - t_field felem(tset->get_elem_type(), elem); + t_type* type = tset->get_elem_type(); + t_field felem(type, elem); generate_deserialize_field(out, &felem, elem); indent(out) << - "[" << fieldName << " addObject: " << containerize(felem.get_type(), elem) << "];" << endl; + "[" << fieldName << " addObject: " << containerize(type, elem) << "];" << endl; + + if (type_can_be_null(type)) { + indent(out) << "[" << containerize(type, elem) << " release];" << endl; + } } /** @@ -1476,12 +1491,17 @@ void t_cocoa_generator::generate_deserialize_list_element(ofstream& out, t_list* tlist, string fieldName) { string elem = tmp("_elem"); - t_field felem(tlist->get_elem_type(), elem); + t_type* type = tlist->get_elem_type(); + t_field felem(type, elem); generate_deserialize_field(out, &felem, elem); indent(out) << - "[" << fieldName << " addObject: " << containerize(felem.get_type(), elem) << "];" << endl; + "[" << fieldName << " addObject: " << containerize(type, elem) << "];" << endl; + + if (type_can_be_null(type)) { + indent(out) << "[" << containerize(type, elem) << " release];" << endl; + } } -- 2.17.1