2009-12-28 18 views
5

के बीच कोई अंतर है, मैं आमतौर पर C++ में प्रोग्रामिंग कर रहा हूं, लेकिन मेरे char * के लिए कुछ क्लाइब्रिक फ़ंक्शंस का उपयोग कर रहा हूं। 'गेटलाइन' के लिए कुछ मैनपेजों का कहना है कि इनपुट एक मॉलोकर्ड सरणी होना चाहिए।malloced arrays और newed arrays

क्या यह ठीक है, इसके बजाय 'नया' उपयोग करना ठीक है?

मैं अपने छोटे नमूने के लिए देख सकता हूं कि यह काम करता है, लेकिन क्या यह किसी बिंदु पर कुछ अजीब अपरिभाषित व्यवहार में हो सकता है?

मुझे पता है कि 'नया' 'डिलीट' से मेल खाना चाहिए, और 'फ्री' के साथ 'मॉलोक' होना चाहिए।

मैं std :: स्ट्रिंग का भी उपयोग नहीं कर रहा हूं। और यह जानबूझकर है।

धन्यवाद

+0

नहीं, यह ठीक नहीं है। लेकिन अगर आप सी ++ का उपयोग कर रहे हैं तो std :: getline() का उपयोग क्यों न करें? –

+2

जब भी आप दस्तावेज में ऐसा कुछ देखते हैं तो आपको गहराई से पता लगाने की आवश्यकता होती है और पता लगाना चाहिए कि क्या वे 'malloced' सूचक की सलाह देते हैं क्योंकि वे सी शब्दावली का उपयोग कर रहे हैं या क्योंकि फ़ंक्शन को realloc() या free() कॉल करने की उम्मीद है। नीचे दिए गए सबसे ज्यादा वोट किए गए उत्तर पूर्व मानते हैं, हालांकि मुझे विश्वास है कि जिस फ़ंक्शन का आप उल्लेख कर रहे हैं उसे बाद में मार्टिन के अंक के रूप में करना होगा। मॉलोक/फ्री और नया/गलत तरीके से मिटाना ठीक नहीं है, इसलिए जब आप आते हैं तो विशिष्ट कार्यों पर अतिरिक्त शोध करना सर्वोत्तम होता है। –

उत्तर

13

बफर को गेटलाइन() पर पास किया गया मॉलोक किया जाना चाहिए।

कारण यह है कि अधिक स्थान आवश्यक होने पर getline() बफर पर realloc() को कॉल कर सकता है।

realloc() जैसे फ्री() केवल malloc() द्वारा आवंटित स्मृति के साथ उपयोग किया जाना चाहिए।इसका कारण यह है malloc() और नए विभिन्न भंडारण क्षेत्रों से स्मृति को आबंटित:

देखें:। What is the difference between new/delete and malloc/free?

मूल रूप से नए प्रयोग "" नि: शुल्क स्टोर ढेर "" जबकि malloc का उपयोग करता है "इन क्षेत्रों में से दोनों का हिस्सा हैं "एप्लिकेशन हीप" (हालांकि मानक को वास्तव में एक आवेदन ढेर की आवश्यकता नहीं होती है क्योंकि यह एक कार्यान्वयन विस्तार है)। हालांकि वे दोनों "एप्लिकेशन हीप" पर हैं, हालांकि इन क्षेत्रों को ओवरलैप नहीं करना चाहिए। चाहे वे कार्यान्वयन का विवरण हों।

getline() के लिए आदमी पेज:

सूचना इस लाइन:

वैकल्पिक रूप से, getline() कॉल करने से पहले, * lineptr एक malloc के लिए एक सूचक शामिल कर सकते हैं() - आकार में आवंटित बफर * n बाइट्स । यदि बफर लाइन को पकड़ने के लिए पर्याप्त नहीं है, तो getline() realloc() के साथ इसका आकार बदलता है, * lineptr और * n को आवश्यकतानुसार अद्यतन करता है।

+2

@ मार्टिन: आप एक जीसीसी-एक्सटेंशन फ़ंक्शन "गेटलाइन" पर इंगित कर रहे हैं। मुझे नहीं लगता कि इस गैर-पोर्टेबल फ़ंक्शन का उपयोग करने की अनुशंसा करना बहुत अच्छा है, खासकर नए लोगों के लिए –

+1

@Eli: प्रश्न विशेष रूप से 'गेटलाइन' का उल्लेख करता है। –

+0

@Eli: मैं किसी भी सी फ़ंक्शन के खिलाफ अनुशंसा करता हूं जहां उपयोग करने योग्य C++ विकल्प है। लेकिन सवाल विशेष रूप से सी गेटलाइन() कार्यक्षमता के बारे में पूछ रहा है। और जब दस्तावेज़ विशेष रूप से malloc (ed) स्मृति का उपयोग करने का उल्लेख करता है तो ऐसा करने के लिए आमतौर पर एक बहुत अच्छा कारण होता है। –

2

हाँ, यह new साथ एक सूचक आवंटित उपयोग करने के लिए जब एक "malloced" एक आशा की जाती है ठीक है।

वैसे, getline आईएसओ सी नहीं है। मानक सी ++ लाइब्रेरी में getline है, लेकिन वह std::string की अपेक्षा करता है। मानक सी फ़ाइल पढ़ने के लिए आपको fgets का उपयोग करना चाहिए। निम्नलिखित काम करता है (सरलीकृत कोड infile के अस्तित्व संभालने और जाँच नहीं करता fgets वापसी मान - जो आप शायद चाहिए वास्तविक कोड में):

// infile is some open FILE* object 
int mylen = 100; 
char* line = new char[mylen]; 
fgets(line, mylen, infile) 

हालांकि, एक अनिवार्य अस्वीकरण: यह std::string और getline उपयोग करने के लिए करता है, तो ज्यादा बेहतर है आप सी ++ का उपयोग कर रहे हैं।

+1

मुझे पता है कि मूल सी मानक एएनएसआई से बाहर आया लेकिन यह एक राष्ट्रीय निकाय है और आईएसओ अब मानक के लिए ज़िम्मेदार है। यदि आप कर सकते हैं तो कृपया "आईएसओ सी" का उपयोग करने का प्रयास करें। – paxdiablo

+1

@paxdiablo: "आईएसओ सी" के लिए तय किया गया। एएनएसआई का उपयोग केवल अतीत की आदत है :-) –

+5

नई (एड) मेमोरी का उपयोग करना हमेशा ठीक नहीं है जहां malloc (ed) की अपेक्षा की जाती है। अगर यह स्मृति को कच्ची मेमोरी ठीक के रूप में उपयोग करता है। लेकिन अगर पॉइंटर्स पर मेमोरी प्रबंधन दिनचर्या का उपयोग किया जाता है तो आप यह धारणा नहीं बना सकते हैं। getline() संभवतः पॉइंटर पास पर realloc() कॉल कर सकते हैं। यह पॉइंटर पर मुफ्त() को कॉल करने के बराबर है यानी यह अनिर्धारित व्यवहार है। –

1

उद्देश्य के लिए 'malloc'ed सरणी' के बजाय 'new'ed array' होना बिल्कुल ठीक है।

दोनों के बीच अंतर (उनमें से कुछ को सूचीबद्ध करने के) हैं:

  • नए/malloc/मुक्त विपरीत जुड़े वस्तु के निर्माता/नाशक फोन को हटा दें। उत्तरार्द्ध प्रारंभिकरण/deinitialisation सामान प्रदर्शन नहीं कर सकता है।
  • नया रिटर्न उचित प्रकार का एक सूचक लेकिन सूचक क्या malloc रिटर्न typecasted जा करने के लिए (C++) है
  • नई/हटाने नई विपरीत realloc विकल्प नहीं है/हटाने

ये बातें करने के लिए नहीं जा रहे हैं अपने कार्यक्रम में बहुत अंतर करें; जैसा ऊपर बताया गया है, 'नया'

आपका कोड विफल नहीं होगा, जब तक कि नया या मॉलोक विफल न हो जाए, तब तक, 'नया' अपवाद फेंकता है, और मॉलोक एक पूर्ण सूचक लौटाता है।

संपादित करें: प्रयोजन के लिए, सरणी 'malloc'ed किया जाना चाहिए। मुझे लगता है कि मैं फिर गलत था! धन्यवाद मार्टिन! :)

+0

@Srivatsan Iyer नहीं कहेंगे: अधिक अंतर के लिए इसे पढ़ें: http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc- मुक्त –

+0

धन्यवाद! दरअसल मैंने बस कुछ बिंदुओं को डालने की कोशिश की; उनमें से ज्यादातर नहीं! : पी – SuperSaiyan

+6

__FAIL__: यह गलत है कि लाइनों को मॉलोक किया जाना चाहिए। निचे देखो। –

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