ঠিক আছে malloc সম্পর্কে কিছু উত্তর ইতিমধ্যে পোস্ট করা হয়েছে।
আরও আকর্ষণীয় অংশটি হ'ল কীভাবে নিখরচায় কাজ করে (এবং এই দিকে, ম্যালোককে আরও ভাল বোঝা যায়)।
অনেক ম্যালোক / ফ্রি বাস্তবায়নে, ফ্রি সাধারণত অপারেটিং সিস্টেমে মেমরি ফিরিয়ে দেয় না (বা কমপক্ষে কেবল বিরল ক্ষেত্রে)। কারণটি হ'ল আপনি আপনার গাদা ফাঁক পেয়ে যাবেন এবং এটি ঘটতে পারে, আপনি কেবল আপনার 2 বা 4 জিবি ভার্চুয়াল মেমরি ফাঁক দিয়ে শেষ করে ফেলবেন। এটি এড়ানো উচিত, যেহেতু ভার্চুয়াল মেমরিটি শেষ হওয়ার সাথে সাথে আপনি সত্যিই বড় সমস্যায় পড়বেন। অন্য কারণটি হ'ল, ওএস কেবলমাত্র একটি নির্দিষ্ট আকার এবং প্রান্তিককরণের মেমরি খণ্ডগুলি পরিচালনা করতে পারে। সুনির্দিষ্ট হতে হবে: সাধারণত ওএস ভার্চুয়াল মেমরি পরিচালক যে ব্লকগুলি পরিচালনা করতে পারে কেবল তা পরিচালনা করতে পারে (প্রায়শই 512 বাইট যেমন 4KB এর গুণক)।
সুতরাং ওএস এ 40 বাইট ফিরিয়ে দেওয়া ঠিক কাজ করবে না। তাহলে ফ্রি কী করে?
ফ্রি মেমরি ব্লককে তার নিজের ফ্রি ব্লক তালিকায় রাখবে। সাধারণত এটি অ্যাড্রেস স্পেসে সংলগ্ন ব্লকগুলি একসাথে মিশ্রিত করার চেষ্টা করে। ফ্রি ব্লক তালিকাটি কেবল মেমরি খণ্ডগুলির একটি বিজ্ঞপ্তি তালিকা যা শুরুতে কিছু প্রশাসনিক ডেটা থাকে। স্ট্যান্ডার্ড ম্যালোক / ফ্রি দিয়ে খুব ছোট মেমরির উপাদানগুলি পরিচালনা করার কারণও এটি। প্রতিটি মেমরি অংশ অতিরিক্ত ডেটা প্রয়োজন এবং ছোট আকারের সাথে আরও খণ্ড খণ্ড ঘটে।
ফ্রি-লিস্টটিও প্রথম স্থান যেখানে ম্যালোক দেখায় যখন একটি নতুন অংশের মেমরি প্রয়োজন হয়। এটি ওএস থেকে নতুন মেমরির কল করার আগে এটি স্ক্যান করা হয়। যখন কোনও অংশ খুঁজে পাওয়া যায় যা প্রয়োজনীয় মেমরির চেয়ে বড়, এটি দুটি ভাগে বিভক্ত হয়। একজনকে কলারে ফিরিয়ে দেওয়া হয়, অন্যটিকে ফ্রি তালিকায় ফেলা হয়।
এই স্ট্যান্ডার্ড আচরণের জন্য অনেকগুলি ভিন্নতর অপ্টিমাইজেশন রয়েছে (উদাহরণস্বরূপ স্মৃতির ক্ষুদ্র অংশগুলির জন্য)। তবে যেহেতু ম্যালোক এবং ফ্রি অবশ্যই সর্বজনীন হতে পারে, বিকল্প ব্যবহারের অযোগ্য হলে স্ট্যান্ডার্ড আচরণটি সর্বদা ফ্যালব্যাক হয়। ফ্রি-তালিকা পরিচালনা করতে অপ্টিমাইজেশন রয়েছে - উদাহরণস্বরূপ আকারগুলি অনুসারে বাছাই করা তালিকায় অংশগুলি সংরক্ষণ করে। তবে সমস্ত অপ্টিমাইজেশনের নিজস্ব সীমাবদ্ধতাও রয়েছে।
কেন আপনার কোড ক্রাশ করে:
কারণটি হ'ল 4 টি অক্ষরের জন্য 9 টি অক্ষর (পিছনের নাল বাইটটি ভুলে যাবেন না) লিখে আপনি সম্ভবত মেমরির অন্য অংশের জন্য সঞ্চিত প্রশাসনিক-তথ্যটি ওভাররাইট করে ফেলতে পারবেন যা আপনার "ডেটা" অংশের পিছনে থাকে ( যেহেতু এই ডেটাটি প্রায়শই মেমরি খণ্ডগুলির "সামনে" সঞ্চিত থাকে)। যখন ফ্রি থাকে তখন আপনার খণ্ডটিকে ফ্রি তালিকায় রাখার চেষ্টা করে, এটি প্রশাসনিক-ডেটাটিকে স্পর্শ করতে পারে এবং তাই একটি ওভাররাইট পয়েন্টারটিতে হোঁচট খেতে পারে। এটি সিস্টেমটি ক্রাশ করবে।
এটি বরং কৌতূহলপূর্ণ আচরণ। আমি এমন পরিস্থিতিও দেখেছি যেখানে কোনও পলাতক পয়েন্টারটি কোথাও মেমরি-মুক্ত-তালিকায় ডেটা ওভাররাইট করে এবং সিস্টেমটি তত্ক্ষণাত ক্রাশ হয় নি তবে কিছু সাব্রোটাইন পরে রয়েছে। এমনকি মাঝারি জটিলতার ব্যবস্থায় এ জাতীয় সমস্যাগুলি সত্যই, ডিবাগ করা সত্যিই কঠিন হতে পারে! আমি যে মামলায় জড়িত ছিলাম তাতে ক্র্যাশটির কারণ খুঁজে পেতে আমাদের (বিকাশকারীদের একটি বৃহত্তর দল) বেশ কয়েক দিন সময় লেগেছিল - যেহেতু এটি মেমরি ডাম্প দ্বারা নির্দেশিত চেয়ে সম্পূর্ণ ভিন্ন অবস্থানে ছিল। এটি একটি টাইম বোমার মতো। আপনি জানেন, আপনার পরবর্তী "ফ্রি" বা "ম্যালোক" ক্র্যাশ হবে, তবে আপনি জানেন না কেন!
সেগুলি হ'ল সবচেয়ে খারাপ সি / সি ++ সমস্যা এবং পয়েন্টারগুলি কেন এতটা সমস্যাযুক্ত হতে পারে তার একটি কারণ।