You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Andrew McGeachie (JIRA)" <ji...@apache.org> on 2009/07/21 19:32:14 UTC

[jira] Reopened: (THRIFT-59) Memory leak reading lists of structs

     [ https://issues.apache.org/jira/browse/THRIFT-59?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Andrew McGeachie reopened THRIFT-59:
------------------------------------


The applied patch is a little over-aggressive.  It also releases NSString objects which are already in the auto-release pool.

Need to tweak it to just release container objects.  e.g.:

{code}
      case 12:
        if (fieldType == TType_LIST) {
          int _size10;
          [inProtocol readListBeginReturningElementType: NULL size: &_size10];
          NSMutableArray * fieldValue = [[NSMutableArray alloc] initWithCapacity: _size10];
          int _i11;
          for (_i11 = 0; _i11 < _size10; ++_i11)
          {
            NSString * _elem12 = [inProtocol readString];
            [fieldValue addObject: _elem12];
            [_elem12 release];
          }
          [inProtocol readListEnd];
          [self setTagGuids: fieldValue];
          [fieldValue release];
        } else { 
          NSLog(@"%s: field ID %i has unexpected type %i.  Skipping.", __PRETTY_FUNCTION__, fieldID, fieldType);
          [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
        }
        break;
{code}

> Memory leak reading lists of structs
> ------------------------------------
>
>                 Key: THRIFT-59
>                 URL: https://issues.apache.org/jira/browse/THRIFT-59
>             Project: Thrift
>          Issue Type: Bug
>          Components: Compiler (Cocoa)
>            Reporter: Andrew McGeachie
>            Assignee: Andrew McGeachie
>         Attachments: thrift-59.patch
>
>
> The Cocoa generated code inside a struct that reads in a field that is a list of structs leaks memory.
> Here's a relevant sample from the read: of a generated struct:
> {noformat}
>       case 3:
>         if (fieldType == TType_LIST) {
>           int _size50;
>           [inProtocol readListBeginReturningElementType: NULL size: &_size50];
>           NSMutableArray * fieldValue = [[NSMutableArray alloc] initWithCapacity: _size50];
>           int _i51;
>           for (_i51 = 0; _i51 < _size50; ++_i51)
>           {
>             MYOBJECT *_elem52 = [[MYOBJECT alloc] init];
>             [_elem52 read: inProtocol];
>             [fieldValue addObject: _elem52];
>           }
>           [inProtocol readListEnd];
>           [self setNotes: fieldValue];
>           [fieldValue release];
>         } else { 
>           [TProtocolUtil skipType: fieldType onProtocol: inProtocol];
>         }
>         break;
> {noformat}
> Each instance of MYOBJECT read in is created with alloc/init and then added to the fieldValue array (which retains it) but then never released.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.