ঠিক আছে, আমি মনে করি আমরা সকলেই একমত হই যে নিম্নলিখিত কোডটি দিয়ে যা ঘটে তা পূর্বনির্ধারিত, যা পাস হয় তার উপর নির্ভর করে,
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)।
তাহলে এসবের কথা মনে রাখা কার কাজ? ওএস কি ব্যাকগ্রাউন্ডে কিছু ধরণের রেকর্ড রাখে? (এর অর্থ, আমি বুঝতে পারি যে আমি এই পোস্টটি এই বলে শুরু করেছিলাম যে যা ঘটে তা অনির্ধারিত, তবে আসল ঘটনাটি হ'ল 'হত্যার স্প্রাই' দৃশ্যটি ঘটে না, তাই বাস্তব বিশ্বে কেউ মনে রাখছে is)