a
नामक दो चर घोषित करना निश्चित रूप से एक त्रुटि है; अगर आपका कंपाइलर इसे स्वीकार करता है, तो यह टूट गया है। मुझे लगता है कि आप का मतलब है कि यदि आप एक घोषणा को दूसरे के साथ बदलते हैं तो आपको अभी भी कोई त्रुटि नहीं मिलती है।
ऐरे पहुंच सीमा-जांच नहीं है। संकलन समय पर, किसी सरणी का आकार अक्सर ज्ञात नहीं होता है, और भाषा को तब भी चेक की आवश्यकता नहीं होती है जब यह हो। रन टाइम पर, एक चेक प्रदर्शन को कम कर देगा, जो सी ++ दर्शन के खिलाफ होगा जो आपको जिस चीज की आवश्यकता नहीं है उसके लिए भुगतान नहीं करेगा। इसलिए किसी सरणी के अंत से परे पहुंच अपरिभाषित व्यवहार प्रदान करती है, और यह सुनिश्चित करने के लिए प्रोग्रामर पर निर्भर करता है कि ऐसा नहीं होता है।
कभी-कभी, एक अवैध पहुंच सेगमेंटेशन गलती होगी, लेकिन इसकी गारंटी नहीं है। आम तौर पर, मेमोरी सुरक्षा केवल कुछ किलोबाइट्स के विशिष्ट पृष्ठ आकार के साथ स्मृति के पूरे पृष्ठों पर लागू होती है। वैध मेमोरी के किसी पृष्ठ के भीतर कोई भी एक्सेस नहीं पकड़ा जाएगा। एक अच्छा मौका है कि आपके द्वारा उपयोग की जाने वाली मेमोरी में कुछ अन्य प्रोग्राम वैरिएबल, या कॉल स्टैक का हिस्सा शामिल है, इसलिए वहां लिखने से प्रोग्राम के व्यवहार को किसी भी तरह से आप कल्पना कर सकते हैं।
यदि आप सुरक्षित होना चाहते हैं, तो आप std::vector
का उपयोग कर सकते हैं, और केवल at()
फ़ंक्शन का उपयोग करके अपने तत्वों तक पहुंच सकते हैं। यह इंडेक्स की जांच करेगा, और अगर यह सीमा से बाहर है तो अपवाद फेंक देगा। यह आपके उदाहरण में मेमोरी रिसाव को ठीक करने के लिए आपके लिए स्मृति आवंटन भी प्रबंधित करेगा।
स्रोत
2012-09-13 15:53:46
दुर्भाग्यवश, परिभाषित व्यवहार ** कभी-कभी ** अपरिभाषित व्यवहार का सबसेट है :( – Mahesh
@ माहेश :)) नहीं। –
@LuchianGrigore ** कभी-कभी ** – Mahesh