2009-12-01 5 views
13

हाल ही में मैं एक जीसीसी विस्तार कि मैं नहीं बल्कि उपयोगी पाया है भर में आया था । उदाहरण के लिए, कोड के निम्नलिखित खंड को देखते हुए, सभी मेमोरी को कॉल के भीतर किसी भी और सभी मामलों में स्पष्ट रूप से बनाए रखा जाना चाहिए और foo पर कॉल किया जाना चाहिए।पोर्टेबल बराबर

void foo() { 
    char * buff = ...; /* some memory allocation */ 
    char * buff2 = 0, * buff3 = 0; 
    if (! buff) { 
     return; 
    } else { 
     buff2 = ...; /* memory allocation */ 
     if (! buff2) { 
     goto clean_exit; 
     } else { 
     /* ... and so on ... */ 
     } 
    } 

clean_exit: 
    free (buff); 
    free (buff2); 
    free (buff3); 
} 

हालांकि, एक्सटेंशन का उपयोग करके कि

#define clean_pchar_scope __attribute__((cleanup(pchar_free))) 

void pchar_free (char ** c) { free (*c); } 

void foo() { 
    char * buff clean_pchar_scope = ...; /* some memory allocation */ 
    char * buff2 clean_pchar_scope = 0, * buff3 clean_pchar_scope = 0; 
    if (! buff) 
     return; 
    buff2 = ...; /* memory allocation */ 
    if (! buff2) 
     return; 
    /* and so on */ 
} 

अब सभी स्मृति नेस्ट अगर/बाकी या गोटो निर्माणों एक समेकित स्मृति के साथ मिलकर के उपयोग के बिना दायरे के आधार पर पुन: दावा करने के लिए कम कर सकते हैं समारोह के रिलीज खंड। मुझे एहसास है कि गेटो के उपयोग से और अधिक घोंसले के लिए बचाया जा सकता है अगर (यानी, कृपया, गोटो पर कोई पवित्र युद्ध नहीं है ...) और यह कि उदाहरण सामने आया है, लेकिन तथ्य यह है कि यह हो सकता है काफी उपयोगी सुविधा।

दुर्भाग्यवश, जहां तक ​​मुझे पता है, यह जीसीसी-विशिष्ट है। मुझे एक ही चीज़ करने के लिए किसी पोर्टेबल तरीके से दिलचस्पी है (यदि वे भी मौजूद हैं)। क्या किसी को भी जीसीसी के अलावा कुछ और करने में अनुभव है?

संपादित करें: लगता है कि पोर्टेबिलिटी खेल में नहीं है। यह ध्यान में रखते हुए, क्या यह जीसीसी स्पेस के के बाहर करने का कोई तरीका है? यह जीसीसी-विशिष्ट होना अच्छा एक सुविधा के लिए की तरह लगता है ...

+0

कुछ हद तक संबंधित: http://stackoverflow.com/questions/1602398/linux-dlopen-can-a-library-be-notified-when-it-is-loaded – jldupont

+0

यह मोटे तौर पर अनाज के लिए थोड़ा सा है मैं देख रहा हूँ। किसी भी मामले में, ऐसा लगता है कि वह समाधान अभी भी जीसीसी विशिष्ट (स्वीकृत उत्तर के लिए) या कक्षा-आधारित उत्तर से संबंधित सी ++ है। – ezpz

उत्तर

8

सी

में कोई पोर्टेबल तरीका उपलब्ध नहीं है सौभाग्य से यह विनाशकर्ता साथ सी के एक मानक सुविधा ++ है।

संपादित करें:

MSVC __try और __finally खोजशब्द जो इस उद्देश्य के लिए और साथ ही इस्तेमाल किया जा सकता है करने के लिए प्रकट होता है। यह सी ++ अपवाद हैंडलिंग से अलग है और मुझे लगता है कि यह सी में उपलब्ध है

मुझे लगता है कि आपको लगता है कि सफाई खोजने के लिए और कोशिश करता हूँ/अंत में व्यापक रूप से सी में निहित समर्थन की वजह से विशेष रूप से उपयोग नहीं किया जाता ++ है, जो सी के लिए "पर्याप्त बंद करें" कि व्यवहार में रूचि रखने वाले लोग आसानी से सी ++ पर अपना कोड बदल सकते हैं।

+0

ठीक है, मैंने पोर्टेबिलिटी चिंताओं को अनदेखा करने के लिए अद्यतन किया है। इसके बाहर, क्या आप इसे जीसीसी के बाहर करने के तरीकों से अवगत हैं? – ezpz

-5

आप उद्देश्य के लिए boost :: shared_ptr का उपयोग कर सकते हैं।

boost::shared_ptr<char> buffer(p, cleanup); 
+2

प्रश्न सी-विशिष्ट है। मैं 'auto_ptr' और' boost :: 'सुविधाओं को समझता हूं, दुर्भाग्यवश वे सी पर लागू नहीं होते हैं। – ezpz

-2
void foo() 
{ 
     char *buf1 = 0, *buf2 = 0, *buf3 = 0; 
     /** more resource handle */ 

     do { 

       if (buf1 = ... , !buf1) break; 
       if (buf2 = ... , !buf2) break; 
       if (buf3 = ... , !buf3) break; 

       /** to acquire more resource */ 

       /** to do with resource */ 

     } while (0); 

     /** to release more resource */ 

     if (buf3) free(buf3); 
     if (buf2) free(buf2); 
     if (buf1) free(buf1); 
} 
3

अपने प्रश्न की पहली छमाही यह करने के लिए पोर्टेबल तरीका है।