ठीक है, मुझे लगता है कि हम सभी सहमत हैं कि निम्नलिखित कोड के साथ क्या होता है अपरिभाषित है, जो पारित हुआ है उसके आधार पर,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
सूचक सभी प्रकार की अलग-अलग चीजें हो सकती हैं, और इसलिए delete[]
उस पर बिना शर्त प्रदर्शन करना अपरिभाषित है। हालाँकि, मान लें कि हम वास्तव में एक सरणी पॉइंटर पास कर रहे हैं,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
मेरा प्रश्न इस मामले जहां सूचक में, है है एक सरणी है, जो यह है कि इस जानता है? मेरा मतलब है, भाषा / संकलक के दृष्टिकोण से, इसका कोई विचार नहीं है कि arr
एक सरणी सूचक बनाम एक एकल इंट करने के लिए एक सूचक है या नहीं । हेक, यह भी नहीं पता है कि क्या arr
गतिशील रूप से बनाया गया था। फिर भी, अगर मैं इसके बजाय निम्नलिखित करता हूं,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
ओएस केवल एक इंट को हटाने के लिए पर्याप्त स्मार्ट है और उस बिंदु से परे शेष मेमोरी को हटाकर किसी प्रकार की 'हत्या की होड़' पर नहीं जाता है (इसके विपरीत strlen
और गैर \0
-स्ट्रिंग स्ट्रिंग के साथ - यह तब तक चलता रहेगा। हिट 0)।
तो इन कामों को याद रखना किसका काम है? क्या OS पृष्ठभूमि में कुछ प्रकार का रिकॉर्ड रखता है? (मेरा मतलब है, मुझे एहसास है कि मैंने यह कहकर इस पद की शुरुआत की कि क्या होता है अपरिभाषित है, लेकिन तथ्य यह है कि, 'हत्या की होड़' परिदृश्य ऐसा नहीं होता है, इसलिए इसलिए व्यावहारिक दुनिया में कोई याद कर रहा है।)