2012-05-07 15 views
8

यदि मैं स्वचालित संदर्भ गणना के साथ मॉलोक का उपयोग करता हूं, तो क्या मुझे अभी भी स्मृति को मैन्युअल रूप से मुक्त करना होगा?malloc + स्वचालित संदर्भ गणना?

int a[100]; 
int *b = malloc(sizeof(int) * 100); 
free(b); 

उत्तर

18

हां, आपको कॉल को free पर कोड करना होगा। हालांकि, अपने सूचक संदर्भ गिनती प्रणाली परोक्ष रूप से में भाग ले सकते है अगर आप इसे एक संदर्भ बार गणना वस्तु का एक उदाहरण में डाल: - एक ही रास्ता या

@interface MyObj : NSObject { 
    int *buf; 
} 
@end 

@implementation MyObj 

-(id)init { 
    self = [super init]; 
    if (self) { 
     buf = malloc(100*sizeof(int)); 
    } 
} 
-(void)dealloc { 
    free(buf); 
} 

@end 

लेखन के आसपास कोई रास्ता नहीं है कि free करने के लिए कॉल नहीं है अन्य, आपको इसे अपने कोड में रखना होगा।

+1

तो एआरसी इस घटना को हटाते समय डेलोक को कॉल करेगा? –

+2

@ स्टैस वेल, सीधे नहीं: एआरसी '[ओबीजे रिलीज]' कहलाएगा - यह उसका एकमात्र काम है। केवल तभी गिनती में परिणाम जारी करते समय शून्य पर जाकर, '[obj dealloc]' कहा जाता है। – dasblinkenlight

5

हां। एआरसी केवल उद्देश्य-सी उदाहरणों पर लागू होता है, और malloc() और free() पर लागू नहीं होता है।

+0

नए int [100] के बारे में क्या ;? –

+0

सं। एआरसी केवल '[क्लासनाम आवंटन]' के साथ बनाए गए उद्देश्य-सी उदाहरणों को संभालता है। –

+0

क्षमा करें, लेकिन क्या आप मुझे बता सकते हैं कि 'Vertex v;' द्वारा बनाई गई संरचना उद्देश्य-सी उदाहरण के रूप में गिना जाएगा? –

0

डीलोक में अगर कोई शून्य नहीं है और सुरक्षित के लिए शून्य को असाइन करें। नील मुक्त नहीं करना चाहते हैं, मॉलोक का उपयोग इनिट आदि के बाहर किया जा सकता है।

@interface MyObj : NSObject { 
    int *buf; 
} 
@end 

@implementation MyObj 

-(id)init { 
    self = [super init]; 
    if (self) { 
     buf = malloc(100*sizeof(int)); 
    } 
} 

-(void)dealloc { 
    if(buf != null) { 
     free(buf); 
     buf = null; 
    } 
} 

@end 
+0

मुझे समझ में नहीं आता कि आप 'defoc' में 'buf! = NULL' क्यों जांचते हैं। यदि आप 'init' में' malloc' के बाद 'buf == NULL' को जांचते हैं, और यदि ऐसा है, तो उस त्रुटि को संभाल लें? फिर, 'defoc' में' buf! = NULL' जांचने की कोई आवश्यकता नहीं है, है ना? साथ ही, 'dealloc' के अंत में' buf = NULL' सेट करने का क्या मतलब है? विशेष रूप से, यदि 'buf' एक निजी आवृत्ति चर है, तो क्या आपको 'dealloc' के नाम के बाद' buf' तक पहुंचने के लिए अपने कोड में कुछ अजीब कुछ नहीं करना होगा? – ma11hew28

+0

आप सही हैं। यदि दुर्घटना से बचने के लिए मुफ्त (शून्य) को कॉल करने से बचने का एकमात्र कारण है। बस परीक्षण किया गया, मुफ्त (शून्य) दुर्घटनाग्रस्त नहीं है। –

संबंधित मुद्दे