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
diff --git a/compiler/cpp/src/generate/t_cocoa_generator.cc b/compiler/cpp/src/generate/t_cocoa_generator.cc
index aefb6a6..762c5b2 100644
--- a/compiler/cpp/src/generate/t_cocoa_generator.cc
+++ b/compiler/cpp/src/generate/t_cocoa_generator.cc
@@ -1443,15 +1443,25 @@
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 @@
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 @@
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;
+ }
}