এটি এমন কিছু যা আমাকে যুগ যুগ ধরে বিরক্ত করেছিল।
আমরা সবাই স্কুলে পড়ানো হয় (কমপক্ষে, আমি ছিলাম) যে আপনি বরাদ্দকৃত প্রতিটি পয়েন্টার মুক্ত করতে হবে। স্মৃতি মুক্ত না করার আসল ব্যয় সম্পর্কে আমি কিছুটা কৌতূহলী কিছু সুস্পষ্ট ক্ষেত্রে, যেমন কখন malloc
লুপের ভিতরে বা থ্রেড এক্সিকিউশনের অংশ হিসাবে ডাকা হয়, মুক্ত করা খুব গুরুত্বপূর্ণ তাই মেমরি ফাঁস নেই। তবে নিম্নলিখিত দুটি উদাহরণ বিবেচনা করুন:
প্রথমত, যদি আমার কাছে কোড থাকে তবে এটি এরকম কিছু:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
এখানে আসল ফলাফল কি? আমার চিন্তাভাবনাটি হ'ল প্রক্রিয়াটি মারা যায় এবং তারপরে theੇਰ জায়গাগুলি যেভাবেই চলে যায় সুতরাং কলটি মিস করার কোনও ক্ষতি নেই free
(তবে, এটি বন্ধকরণ, রক্ষণাবেক্ষণযোগ্যতা এবং ভাল অনুশীলনের জন্য যাই হোক না কেন আমি এর গুরুত্ব স্বীকার করি)। আমি কি এই ভাবনায় ঠিক আছি?
দ্বিতীয়ত, ধরা যাক আমার কাছে একটি প্রোগ্রাম রয়েছে যা শেলের মতো কিছুটা কাজ করে। ব্যবহারকারীরা ভেরিয়েবলের মতো ঘোষণা করতে পারে aaa = 123
এবং সেগুলি পরে ব্যবহারের জন্য কিছু গতিশীল ডেটা স্ট্রাকচারে সঞ্চিত থাকে। স্পষ্টতই, এটি সুস্পষ্ট বলে মনে হচ্ছে আপনি এমন কোনও সমাধান ব্যবহার করবেন যা কিছু * বরাদ্দ ফাংশন (হ্যাশম্যাপ, লিঙ্কযুক্ত তালিকা, এরকম কিছু) কল করবে। এই ধরণের প্রোগ্রামের জন্য, কল করার পরে এটি কখনই মুক্ত হওয়ার কোনও অর্থ হয় না malloc
কারণ এই ভেরিয়েবলগুলি অবশ্যই প্রোগ্রামের সম্পাদনার সময় সর্বদা উপস্থিত থাকতে হবে এবং স্থিতিশীলভাবে বরাদ্দ স্থান সহ এটিকে বাস্তবায়নের জন্য কোনও ভাল উপায় নেই (যা আমি দেখতে পাচ্ছি)। বরাদ্দ দেওয়া হলেও প্রক্রিয়াটি শেষ হওয়ার অংশ হিসাবে কেবল মুক্ত করা এমন একগুচ্ছ স্মৃতি থাকা কি খারাপ নকশা? যদি তাই হয়, বিকল্প কি?
free(a)
প্রকৃতপক্ষে মুক্ত মেমরির জন্য কিছুই করে না! এটি কেবলমাত্র malloc এর libc বাস্তবায়নের কিছু পয়েন্টার পুনরায় সেট করে যা বড় ম্যাম্যাপযুক্ত মেমরি পৃষ্ঠার (সাধারণত "হিপ" নামে পরিচিত) ভিতরে মেমরির বিভিন্ন অংশের ট্র্যাক রাখে। সেই পৃষ্ঠাটি কেবল তখনই মুক্ত হতে চলেছে যখন আপনার প্রোগ্রামটি ইতিপূর্বে শেষ হবে।