हाल ही में मैं एक जीसीसी विस्तार कि मैं नहीं बल्कि उपयोगी पाया है भर में आया था । उदाहरण के लिए, कोड के निम्नलिखित खंड को देखते हुए, सभी मेमोरी को कॉल के भीतर किसी भी और सभी मामलों में स्पष्ट रूप से बनाए रखा जाना चाहिए और 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 */
}
अब सभी स्मृति नेस्ट अगर/बाकी या गोटो निर्माणों एक समेकित स्मृति के साथ मिलकर के उपयोग के बिना दायरे के आधार पर पुन: दावा करने के लिए कम कर सकते हैं समारोह के रिलीज खंड। मुझे एहसास है कि गेटो के उपयोग से और अधिक घोंसले के लिए बचाया जा सकता है अगर (यानी, कृपया, गोटो पर कोई पवित्र युद्ध नहीं है ...) और यह कि उदाहरण सामने आया है, लेकिन तथ्य यह है कि यह हो सकता है काफी उपयोगी सुविधा।
दुर्भाग्यवश, जहां तक मुझे पता है, यह जीसीसी-विशिष्ट है। मुझे एक ही चीज़ करने के लिए किसी पोर्टेबल तरीके से दिलचस्पी है (यदि वे भी मौजूद हैं)। क्या किसी को भी जीसीसी के अलावा कुछ और करने में अनुभव है?
संपादित करें: लगता है कि पोर्टेबिलिटी खेल में नहीं है। यह ध्यान में रखते हुए, क्या यह जीसीसी स्पेस के के बाहर करने का कोई तरीका है? यह जीसीसी-विशिष्ट होना अच्छा एक सुविधा के लिए की तरह लगता है ...
कुछ हद तक संबंधित: http://stackoverflow.com/questions/1602398/linux-dlopen-can-a-library-be-notified-when-it-is-loaded – jldupont
यह मोटे तौर पर अनाज के लिए थोड़ा सा है मैं देख रहा हूँ। किसी भी मामले में, ऐसा लगता है कि वह समाधान अभी भी जीसीसी विशिष्ट (स्वीकृत उत्तर के लिए) या कक्षा-आधारित उत्तर से संबंधित सी ++ है। – ezpz