2010-05-26 20 views
8

मैं एक अंतिम परीक्षा के लिए पढ़ रहा हूं और मैंने एक उत्सुक प्रश्न पर ठोकर खाई जो हमारे शिक्षक ने पिछले साल कुछ गरीब आत्माओं को दी गई परीक्षा का हिस्सा था। सवाल इस तरह कुछ जाता है:कक्षा के सदस्यों के साथ क्या होता है जब नए के बजाए मॉलोक का उपयोग किया जाता है?

क्या निम्न प्रोग्राम सही है, या नहीं? यदि ऐसा है, तो प्रोग्राम आउटपुट क्या लिखें। यदि ऐसा नहीं है, तो क्यों लिखें।

कार्यक्रम:

#include<iostream.h> 
class cls 
{  int x; 
     public: cls() { x=23; } 
     int get_x(){ return x; } }; 
int main() 
{  cls *p1, *p2; 
     p1=new cls; 
     p2=(cls*)malloc(sizeof(cls)); 
     int x=p1->get_x()+p2->get_x(); 
     cout<<x; 
     return 0; 
} 

मेरी पहली वृत्ति के साथ जवाब देने के लिए था, "कार्यक्रम नहीं सही, के रूप में newmalloc के बजाय इस्तेमाल किया जाना चाहिए है।" हालांकि, प्रोग्राम को संकलित करने और इसे 23 आउटपुट देखने के बाद मुझे एहसास हुआ कि यह उत्तर सही नहीं हो सकता है।

समस्या यह है कि मुझे कुछ मनमाना संख्या वापस करने के लिए p2->get_x() की उम्मीद थी (malloc को स्मृति के उस स्थान पर जो कुछ भी हुआ था)। हालांकि, यह 0 लौटा। मुझे यकीन नहीं है कि यह एक संयोग है या यदि कक्षा के सदस्यों को malloc -ed के साथ 0 के साथ प्रारंभ किया गया है।

  • क्या यह व्यवहार (p2->xmalloc के बाद 0 है) डिफ़ॉल्ट? क्या मुझे की उम्मीद है यह?
  • आपके मेरे शिक्षक के प्रश्न का उत्तर क्या होगा? (malloc के लिए #include <stdlib.h> को भूल के अलावा: पी)
+4

0 मनमानी संख्या क्यों नहीं हो सकता है? –

+0

किसी और चीज़ के अलावा ' 'केवल' 'होना चाहिए। –

+0

आप अपने शिक्षक की मेमोरी लीक भी ठीक कर सकते हैं। –

उत्तर

14
  • क्या यह व्यवहार (पी 2-> x malloc के बाद 0 होना) डिफ़ॉल्ट है? क्या मुझे यह उम्मीद करनी चाहिए?

नहीं, पी 2-> एक्स मॉलोक के कॉल के बाद कुछ भी हो सकता है। यह आपके परीक्षण वातावरण में 0 होता है।

  • मेरे शिक्षक के प्रश्न का आपका उत्तर क्या होगा? (malloc के लिए # शामिल करने के अलावा भूलना: पी)

हर किसी ने आपको क्या बताया है, नया ऑब्जेक्ट के कन्स्ट्रक्टर को कॉल के साथ फ्रीस्टोर से स्मृति प्राप्त करने के लिए कॉल को जोड़ता है। मॉलोक केवल उसमें से आधा है।

इसे ठीक करना: नमूना कार्यक्रम गलत है। कक्षाओं के साथ "malloc" का उपयोग करना हमेशा गलत नहीं होता है।

p2=(cls*)malloc(sizeof(cls)); 
new(p2) cls; 
+2

यदि आप प्लेसमेंट का उपयोग कर रहे हैं तो आपको भी विनाशक को स्पष्ट रूप से कॉल करना होगा (आप डिलीट का उपयोग नहीं कर सकते क्योंकि आपने नया उपयोग नहीं किया था)। इसके अलावा आपको यह भी जोर देना चाहिए कि यह आम नहीं है (जब आप कई वस्तुओं के लिए स्टोरेज आवंटित करते हैं (केवल एक नहीं) तो अपने स्वयं के कंटेनर का निर्माण करते समय मेनली का उपयोग किया जाता है) –

+1

मैं 'reinterpret_cast' का उपयोग करने के लिए बहस करता हूं। यह जोर देता है कि आप कुछ बहुत खतरनाक कर रहे हैं। –

+0

मैथ्यूयू एम के जवाब में, मैं 5 साल के पुराने प्रश्नों को संपादित करना पसंद नहीं करता लेकिन इंप्रेसेंट, मैं उपरोक्त मेरे अंतिम उदाहरण को शून्य * पी 2 बफर = मॉलोक (आकार (सीएलएस) के रूप में फिर से लिखूंगा; सीएलएस * पी 2 = नया (पी 2 बफर) सीएल; इस तरह आप बाद में पी 2-> ~ सीएलएस और फ्री (पी 2 बफर) को कॉल कर सकते हैं; और यह स्पष्ट है कि पी 2 "क्लास ऑब्जेक्ट" है और पी 2 बफर आवंटित मेमोरी पॉइंटर है। – jmucchiello

3

नई कॉल निर्माता, malloc नहीं होगा। तो आपकी वस्तु अज्ञात स्थिति में होगी।

+0

की स्ट्रगलल्स मुझे पता है कि 'malloc' कन्स्ट्रक्टर को कॉल नहीं करता है। मेरा प्रश्न कक्षा के सदस्य 'x' के बारे में था - क्या इसे 0 के साथ प्रारंभ किया जाता है या क्या उस स्थान पर स्मृति में कुछ यादृच्छिक मान मिलता है? – Felix

+1

@ फ़ेलिक्स: यदि निर्माता को नहीं कहा जाता है, तो सदस्य डेटा का मान अपरिभाषित व्यवहार है। – Cascabel

+1

@ फ़ेलिक्स एक्स शुरू करना एक्स कन्स्ट्रक्टर में होता है, इसलिए यह अपरिभाषित है। यहां तक ​​कि 'new' का उपयोग करने से एक्स शून्य नहीं होगा जब तक कि एक्स को वास्तव में कन्स्ट्रक्टर में 0 पर सेट नहीं किया गया था; सदस्य फ़ील्ड को जावा –

1

वास्तविक व्यवहार अज्ञात है, क्योंकि newmalloc + constructor कॉल जैसा ही काम करता है।

आपके कोड में, दूसरा भाग गुम है, इसलिए, यह एक मामले में काम कर सकता है, यह नहीं कर सका, लेकिन आप बिल्कुल नहीं कह सकते हैं।

0

क्यों नहीं 0 एक मनमाना संख्या भी हो सकता है: यह एक साझा स्मृति स्थिति तुम सिर्फ नई करने के लिए एक में जगह कॉल जोड़ने के लिए में पूरी तरह से वैध है?क्या आप डीबग मोड में चल रहे हैं? क्या कंपाइलर?

वीसी ++ 0xCC बाइट मानों (डीबग मोड के पाठ्यक्रम में) की स्ट्रिंग के साथ नई आवंटित स्मृति को पूर्व-भर देता है ताकि यदि आप इसका उपयोग कर रहे हों तो आपको उत्तर के लिए शून्य प्राप्त नहीं होता।

+0

मैं g ++ का उपयोग कर रहा हूं, कोई डीबग नहीं। – Felix

0

मॉलोक आवंटित स्मृति को शून्य करने के लिए कोई गारंटी नहीं देता है और प्रोग्राम का परिणाम अपरिभाषित है।

अन्यथा ऐसी कई अन्य चीजें हैं जो इस प्रोग्राम को सही C++ होने से रोकती हैं। cout नामस्थान std में है, malloc को #include <cstdlib> और iostream.h के माध्यम से शामिल करने की आवश्यकता है या तो मानक अनुपालन नहीं है।

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