আপনি যখন ম্যালোকের পরে মুক্ত না হন তখন আসলে কী হয়?


538

এটি এমন কিছু যা আমাকে যুগ যুগ ধরে বিরক্ত করেছিল।

আমরা সবাই স্কুলে পড়ানো হয় (কমপক্ষে, আমি ছিলাম) যে আপনি বরাদ্দকৃত প্রতিটি পয়েন্টার মুক্ত করতে হবে। স্মৃতি মুক্ত না করার আসল ব্যয় সম্পর্কে আমি কিছুটা কৌতূহলী কিছু সুস্পষ্ট ক্ষেত্রে, যেমন কখন mallocলুপের ভিতরে বা থ্রেড এক্সিকিউশনের অংশ হিসাবে ডাকা হয়, মুক্ত করা খুব গুরুত্বপূর্ণ তাই মেমরি ফাঁস নেই। তবে নিম্নলিখিত দুটি উদাহরণ বিবেচনা করুন:

প্রথমত, যদি আমার কাছে কোড থাকে তবে এটি এরকম কিছু:

int main()
{
    char *a = malloc(1024);
    /* Do some arbitrary stuff with 'a' (no alloc functions) */
    return 0;
}

এখানে আসল ফলাফল কি? আমার চিন্তাভাবনাটি হ'ল প্রক্রিয়াটি মারা যায় এবং তারপরে theੇਰ জায়গাগুলি যেভাবেই চলে যায় সুতরাং কলটি মিস করার কোনও ক্ষতি নেই free(তবে, এটি বন্ধকরণ, রক্ষণাবেক্ষণযোগ্যতা এবং ভাল অনুশীলনের জন্য যাই হোক না কেন আমি এর গুরুত্ব স্বীকার করি)। আমি কি এই ভাবনায় ঠিক আছি?

দ্বিতীয়ত, ধরা যাক আমার কাছে একটি প্রোগ্রাম রয়েছে যা শেলের মতো কিছুটা কাজ করে। ব্যবহারকারীরা ভেরিয়েবলের মতো ঘোষণা করতে পারে aaa = 123এবং সেগুলি পরে ব্যবহারের জন্য কিছু গতিশীল ডেটা স্ট্রাকচারে সঞ্চিত থাকে। স্পষ্টতই, এটি সুস্পষ্ট বলে মনে হচ্ছে আপনি এমন কোনও সমাধান ব্যবহার করবেন যা কিছু * বরাদ্দ ফাংশন (হ্যাশম্যাপ, লিঙ্কযুক্ত তালিকা, এরকম কিছু) কল করবে। এই ধরণের প্রোগ্রামের জন্য, কল করার পরে এটি কখনই মুক্ত হওয়ার কোনও অর্থ হয় না mallocকারণ এই ভেরিয়েবলগুলি অবশ্যই প্রোগ্রামের সম্পাদনার সময় সর্বদা উপস্থিত থাকতে হবে এবং স্থিতিশীলভাবে বরাদ্দ স্থান সহ এটিকে বাস্তবায়নের জন্য কোনও ভাল উপায় নেই (যা আমি দেখতে পাচ্ছি)। বরাদ্দ দেওয়া হলেও প্রক্রিয়াটি শেষ হওয়ার অংশ হিসাবে কেবল মুক্ত করা এমন একগুচ্ছ স্মৃতি থাকা কি খারাপ নকশা? যদি তাই হয়, বিকল্প কি?


7
@ এনটিডিএলএস রেটিং সিস্টেমের যাদুটি আসলে একবারের জন্য কাজ করছে: 6 বছর এবং "আরও উপযুক্ত" উত্তরটি সত্যই শীর্ষে উঠে গেছে।
zxq9

15
নীচের লোকেরা বলে চলেছে যে একটি ভাল আধুনিক ওএস ক্লিনআপ করে তবে কি যদি কোডটি কার্নেল মোডে চলছে (উদাহরণস্বরূপ, কার্য সম্পাদনের কারণে)? কার্নেল মোড প্রোগ্রামগুলি (উদাহরণস্বরূপ লিনাক্সে) স্যান্ডবক্সযুক্ত রয়েছে? যদি তা না হয় তবে আমি বিশ্বাস করি যে আপনাকে ম্যানুয়ালি সব কিছু মুক্ত করতে হবে, আমি মনে করি, এমনকি কোনও অস্বাভাবিক অবসন্নকরণের আগেও অ্যাবার্ট () ছাড়ার আগেই।
ডাঃ ব্যক্তি ব্যক্তি ২ য়

3
@ ডাঃ পার্সনপারসনআইআই হ্যাঁ, কার্নেল মোডে চলমান কোডগুলি সাধারণত ম্যানুয়ালি সমস্ত কিছু মুক্ত করতে হয়।
zwol

1
আমি যুক্ত করতে চাই যে free(a)প্রকৃতপক্ষে মুক্ত মেমরির জন্য কিছুই করে না! এটি কেবলমাত্র malloc এর libc বাস্তবায়নের কিছু পয়েন্টার পুনরায় সেট করে যা বড় ম্যাম্যাপযুক্ত মেমরি পৃষ্ঠার (সাধারণত "হিপ" নামে পরিচিত) ভিতরে মেমরির বিভিন্ন অংশের ট্র্যাক রাখে। সেই পৃষ্ঠাটি কেবল তখনই মুক্ত হতে চলেছে যখন আপনার প্রোগ্রামটি ইতিপূর্বে শেষ হবে।
মার্কো বোনেলি 16'19

1
নিখরচায় () সম্ভবত মেমরিটি মুক্তি দেয় বা নাও পারে। এটি কেবল এই ব্লকটিকে মুক্ত হিসাবে চিহ্নিত করা হবে, পরে পুনরায় দাবি করা হবে বা এটিকে একটি ফ্রি তালিকার সাথে যুক্ত করতে পারে। এটি এটি সংলগ্ন ফ্রি ব্লকগুলিতে একীভূত করতে পারে, বা এটি পরবর্তী বরাদ্দের জন্য ছেড়ে যেতে পারে। এটি সমস্ত বাস্তবায়নের বিশদ।
জর্দান ব্রাউন

উত্তর:


378

প্রায় প্রতিটি আধুনিক অপারেটিং সিস্টেম কোনও প্রোগ্রামের প্রস্থানের পরে বরাদ্দকৃত সমস্ত মেমরির স্থান পুনরুদ্ধার করে। পাম ওএস এর মতো কিছু হতে পারে যা আমি ভাবতে পারি না যেখানে প্রোগ্রামটির স্ট্যাটিক স্টোরেজ এবং রানটাইম মেমরি একই জিনিস, তাই নিখরচায় না করার ফলে প্রোগ্রামটি আরও স্টোরেজ গ্রহণ করতে পারে। (আমি কেবল এখানে অনুমান করছি))

আপনার সাধারণত প্রয়োজনের চেয়ে বেশি স্টোরেজ চালানোর রানটাইম ব্যতীত সাধারণভাবে তাই এর কোনও ক্ষতি নেই। অবশ্যই আপনি যে উদাহরণটি দিয়েছেন তাতে আপনি একটি ভেরিয়েবলের জন্য মেমরিটি রাখতে চান যা এটি সাফ না হওয়া অবধি ব্যবহার করা যেতে পারে।

যাইহোক, মেমোরি মুক্ত করার জন্য এটি আপনার আর প্রয়োজন না হওয়ার সাথে সাথে এবং প্রোগ্রামের প্রস্থানের সময় আপনার কাছে থাকা কোনও কিছুকে মুক্ত করার জন্য এটি ভাল স্টাইল হিসাবে বিবেচিত হয়। আপনি কী স্মৃতি ব্যবহার করছেন তা জেনে রাখা এবং আপনার এখনও এটির প্রয়োজন কিনা তা নিয়ে চিন্তাভাবনা করার বিষয়টি আরও বেশি। আপনি যদি ট্র্যাক না রাখেন তবে আপনার মেমরি ফাঁস হতে পারে।

অন্যদিকে, প্রস্থান করার সময় আপনার ফাইলগুলি বন্ধ করার অনুরূপ উপদেশের অনেক বেশি কংক্রিট ফলাফল রয়েছে - আপনি যদি তা না করেন তবে আপনি তাদের যে ডেটা লিখেছেন তা ফ্লাশ না হতে পারে, বা যদি তারা কোনও অস্থায়ী ফাইল হয় তবে তারা নাও পারে কাজ শেষ হয়ে গেলে মুছুন। এছাড়াও, ডাটাবেস হ্যান্ডলে তাদের লেনদেনগুলি প্রতিশ্রুতিবদ্ধ করা উচিত এবং তারপরে আপনি যখন সেগুলি সম্পন্ন করেন তখন তা বন্ধ করে দেওয়া উচিত। একইভাবে, আপনি যদি সি ++ বা অবজেক্টিভ সি এর মতো কোনও অবজেক্ট ওরিয়েন্টেড ভাষা ব্যবহার করে থাকেন, যখন আপনি যখন এটির কাজটি সম্পন্ন করছেন তখন কোনও বিষয়কে মুক্ত না করা মানে ডিস্ট্রাক্টরকে কখনই ডাকা হবে না এবং শ্রেণীর দায়িত্বে থাকা কোনও সংস্থান সম্ভবত পরিষ্কার নাও হতে পারে।


16
এটি সম্ভবত উল্লেখ করা ভাল হবে যে সবাই আধুনিক অপারেটিং সিস্টেম ব্যবহার করছে না, যদি কেউ আপনার প্রোগ্রাম গ্রহণ করে (এবং এটি এখনও কোনও ওএসে চলে যা স্মৃতি পুনরুদ্ধার করে না) এটি চালায় তবে জিজি।
ব্যবহারকারী 105033

79
আমি সত্যিই এই উত্তরটিকে ভুল হিসাবে বিবেচনা করছি one এক সাথে সর্বদা রিসোর্সগুলি অপসারণ করা উচিত, সেগুলি হ্যান্ডলস / মেমরি / মিটেক্সগুলি ফাইল করা হোক। সেই অভ্যাসটি থাকা অবস্থায়, সার্ভারগুলি তৈরি করার সময় কেউ সেই ধরণের ভুল করতে পারে না। কিছু সার্ভার 24x7 চালিত হবে বলে আশা করা হচ্ছে। এই ক্ষেত্রে, যে কোনও প্রকারের ফাঁস হওয়ার অর্থ আপনার সার্ভারটি শেষ পর্যন্ত সেই সংস্থানটি শেষ হয়ে যাবে এবং কোনওভাবে হ্যাং / ক্র্যাশ হবে। একটি সংক্ষিপ্ত ইউটিলিটি প্রোগ্রাম, হ্যাঁ একটি ফুটো খুব খারাপ নয়। যে কোনও সার্ভার, যে কোনও ফাঁসই মৃত্যু। নিজেকে একটি অনুগ্রহ করুন। নিজের পরে পরিষ্কার করুন। এটি একটি ভাল অভ্যাস।
এভিলটিচ

120
"তবে এর কোন অংশটি, আপনার আর প্রয়োজন হবে না তাড়াতাড়ি মেমরি মুক্ত করা ভাল স্টাইল হিসাবে বিবেচিত হয় এবং প্রোগ্রামের প্রস্থানের সময় আপনার কাছে থাকা কোনও কিছুকে মুক্ত করতে"। আপনি কি ভুল বিবেচনা, তারপর?
পল টমলিন

24
আপনার যদি একটি মেমরি স্টোর থাকে যা আপনার ঠিক শেষ হওয়া অবধি প্রোগ্রামটি শেষ না হওয়া অবধি প্রয়োজন হয় এবং আপনি কোনও আদিম OS এ চালাচ্ছেন না, তারপরে বাইরে বেরোনোর ​​আগে মেমরিটি মুক্ত করা কোনও স্টাইলিস্টিক পছন্দ, কোনও ত্রুটি নয়।
পল টমলিন

30
@ পল - কেবলমাত্র এভিলটিচের সাথে একমত হওয়া মেমরি মুক্ত করার পক্ষে ভাল স্টাইল হিসাবে বিবেচিত হয় না, মেমরি মুক্ত না করা ভুল rect আপনার শব্দবন্ধটি এটিকে আপনার টাইয়ের সাথে মেলে এমন রুমাল পরা যতটা গুরুত্বপূর্ণ বলে মনে হয়। আসলে, এটি প্যান্ট পরা স্তর on
হান্নিকট

110

হ্যাঁ আপনি ঠিক বলেছেন, আপনার উদাহরণটি কোনও ক্ষতি করে না (কমপক্ষে বেশিরভাগ আধুনিক অপারেটিং সিস্টেমগুলিতে নয়)। আপনার প্রক্রিয়া দ্বারা বরাদ্দকৃত সমস্ত মেমরি অপসেসিং সিস্টেমের দ্বারা প্রক্রিয়াটি শেষ হয়ে গেলে পুনরুদ্ধার করা হবে।

উত্স: বরাদ্দ এবং জিসি মিথগুলি (পোস্টস্ক্রিপ্ট সতর্কতা!)

বরাদ্দকথায় পৌরাণিক কল্প 4: নন-আবর্জনা-সংগৃহীত প্রোগ্রামগুলি সর্বদা তাদের বরাদ্দকৃত সমস্ত স্মৃতি হ্রাস করতে হবে।

সত্য: প্রায়শই সম্পাদিত কোডগুলিতে অনুমোদিত ছাড়ের কারণে বর্ধমান ফাঁস ঘটে। এগুলি খুব কমই গ্রহণযোগ্য। তবে প্রোগ্রামগুলি প্রস্থান না হওয়া পর্যন্ত সর্বাধিক বরাদ্দ মেমরি ধরে রাখে এমন প্রোগ্রামগুলি কোনও হস্তক্ষেপ ছাড়ার ছাড়াই প্রায়শই ভাল সম্পাদন করে। মলোক নিখরচায় না থাকলে প্রয়োগ করা অনেক সহজ।

বেশিরভাগ ক্ষেত্রে, প্রোগ্রামের প্রস্থানের ঠিক আগে মেমরিকে অবর্ণন করা অর্থহীন। ওএস এটিকে যাইহোক দাবি করবে will বিনামূল্যে মৃত বস্তুগুলিতে স্পর্শ এবং পৃষ্ঠা স্পর্শ করবে; ওএস করবে না।

ফলাফল: বরাদ্দ গণনা করা "ফুটো ডিটেক্টর" এর সাথে সতর্ক থাকুন। কিছু "ফাঁস" ভাল!

এটি বলেছিল, আপনার সমস্ত স্মৃতি ফাঁসিকে এড়িয়ে যাওয়ার চেষ্টা করা উচিত!

দ্বিতীয় প্রশ্ন: আপনার নকশা ঠিক আছে। আপনার অ্যাপ্লিকেশনটি প্রস্থান না হওয়া অবধি যদি আপনার কিছু সঞ্চয় করতে হয় তবে ডায়নামিক মেমোরি বরাদ্দ দিয়ে এটি করা ঠিক। আপনি যদি প্রয়োজনীয় আকারের সামনের অংশটি জানেন না, আপনি স্ট্যাটিকালি বরাদ্দ মেমরিটি ব্যবহার করতে পারবেন না।


3
হতে পারে কারণ আমি যেমন এটি পড়েছি প্রশ্নটি হ'ল প্রকৃতপক্ষে ফাঁস হওয়া স্মৃতিতে কী ঘটছে, এই নির্দিষ্ট উদাহরণটি ঠিক আছে কিনা তা নয়। আমি যদিও এটিকে ভোট দেব না, কারণ এটি এখনও একটি ভাল উত্তর।
ডিভিনবি

3
সম্ভবত এটি ছিল (প্রারম্ভিক উইন্ডোজ, প্রারম্ভিক ম্যাক ওএস), এবং সম্ভবত এখনও রয়েছে, ওএসগুলির প্রস্থান করার আগে মেমরি মুক্ত করার প্রক্রিয়াগুলির প্রয়োজন হয় অন্যথায় স্থানটি পুনরুদ্ধার করা হয় না।
পিট কির্খাম

এটি পুরোপুরি ঠিক আছে, যতক্ষণ না আপনি মেমরি খণ্ডিত বা স্মৃতিশক্তি না ছোঁড়ার বিষয়ে চিন্তা করেন না - আপনি এটি খুব বেশি করেন এবং আপনার অ্যাপ্লিকেশনগুলির কার্য সম্পাদন অদৃশ্য হয়ে যায়। কঠোর তথ্য ছাড়াও সর্বদা সর্বোত্তম অনুশীলন এবং ভাল অভ্যাসের বিল্ডিং অনুসরণ করুন।
এনটিডিএলএস

1
আমার কাছে একটি গ্রহণযোগ্য উত্তর আছে যা বর্তমানে -11 প্রায় বসে আছে, তাই তিনি রেকর্ডের জন্য দৌড়েও নেই।
পল টমবলিন

8
আমি মনে করি ফ্রি () 'ফাঁস সনাক্তকারীর কারণেই' মেমোরিটির প্রয়োজনীয়তা ব্যাখ্যা করা ভুল wrong এটি বলার মতোই "আপনাকে একটি খেলার রাস্তায় ধীরে ধীরে গাড়ি চালাতে হবে কারণ পুলিশ সদস্যরা একটি স্পিড ক্যামেরা সহ আপনার জন্য অপেক্ষা করতে পারে"।
সেবাস্তিয়ান মাচ

57

=== ভবিষ্যতের প্রুফিং এবং কোড পুনরায় ব্যবহার সম্পর্কে কী ? ===

আপনি যদি বিষয়গুলি মুক্ত করার জন্য কোডটি না লিখে থাকেন তবে আপনি কোডটি কেবলমাত্র ব্যবহারের জন্য সীমাবদ্ধ করে দিচ্ছেন যখন আপনি প্রক্রিয়াটি বন্ধ হয়ে যাওয়ার দ্বারা মেমরি মুক্ত করার উপর নির্ভর করতে পারবেন ... অর্থাৎ ছোট এক সময়ের ব্যবহার প্রকল্প বা "থ্রো-অ্যাওয়ে" [1] প্রকল্পগুলি) ... যেখানে আপনি জানেন যে প্রক্রিয়াটি কখন শেষ হবে।

আপনি যদি না বিনামূল্যের () আপনার সব পরিবর্তনশীল বরাদ্দ মেমরির গুলি, তাহলে আপনি ভবিষ্যতে কোড প্রুফিং এবং লেট হয় কোড লিখতে অন্যদের একটি বড় প্রকল্পে এটি ব্যবহার।


[1] "নিক্ষেপ" প্রকল্প সম্পর্কিত। "থ্রো-অ্যাওয়ে" প্রকল্পগুলিতে ব্যবহৃত কোডের নিক্ষেপ না করার একটি উপায় রয়েছে। আপনি জানেন যে দশ বছর কেটে গেছে এবং আপনার "থ্রো-অ্যাও" কোডটি এখনও ব্যবহৃত হচ্ছে)।

আমি এমন কিছু লোকের গল্প শুনেছি যারা তার হার্ডওয়ারটি আরও ভালভাবে চালানোর জন্য মজাদার জন্য কিছু কোড লিখেছিল। তিনি বলেছিলেন " কেবল শখ, বড় এবং পেশাদার হবে না "। বছর বছর পরে প্রচুর লোকেরা তার "শখ" কোডটি ব্যবহার করছেন।


8
"ছোট প্রকল্প" এর জন্য ডাউনভোটেড। অনেকগুলি বৃহত প্রকল্প রয়েছে যা খুব ইচ্ছাকৃতভাবে প্রস্থান করার সময় মেমরি মুক্ত করে না কারণ আপনি যদি নিজের টার্গেট প্ল্যাটফর্মগুলি জানেন তবে এটি সময় নষ্ট করে। আইএমও, আরও সঠিক উদাহরণটি "বিচ্ছিন্ন প্রকল্প" হত projects যেমন আপনি যদি পুনরায় ব্যবহারযোগ্য লাইব্রেরি তৈরি করেন যা অন্যান্য অ্যাপ্লিকেশনগুলিতে অন্তর্ভুক্ত করা হয় তবে কোনও সঠিকভাবে সংজ্ঞায়িত প্রস্থান পয়েন্ট নেই যাতে আপনার স্মৃতি ফাঁস না হওয়া উচিত। স্বতন্ত্র অ্যাপ্লিকেশনটির জন্য, প্রক্রিয়াটি কখন শেষ হবে আপনি ঠিক তা জানতে পারবেন এবং ওএসে ক্লিনআপ অফলোড করার বিষয়ে সচেতন সিদ্ধান্ত নিতে পারেন (যেটি চেক করতে হয়)।
ডেন বেচার্ড

গতকালের অ্যাপ্লিকেশনটি আজকের লাইব্রেরি ফাংশন এবং আগামীকাল এটি একটি দীর্ঘকালীন সার্ভারের সাথে যুক্ত হবে যা এটিকে হাজারবার কল করে।
অ্যাড্রিয়ান ম্যাকার্থি

1
@ অ্যাড্রিয়ানম্যাকার্থি: কোনও ফাংশন যদি স্থির পয়েন্টারটি শূন্য হয় কিনা তা পরীক্ষা করে, এটি malloc()যদি হয় তবে এটি শুরু করে এবং পয়েন্টারটি শূন্য থাকলে অবসান হয়, যদি freeকখনও না বলা হয় তবে এ জাতীয় ফাংশনটি নিরাপদে একটি নির্বিচার সংখ্যক বার ব্যবহার করা যেতে পারে । আমি মনে করি মেমরি ফুটোকে পার্থক্য করা সম্ভবত সার্থক, যা সীমাহীন পরিমাণ সঞ্চয়স্থান ব্যবহার করতে পারে, বনাম এমন পরিস্থিতি যা কেবলমাত্র একটি সীমাবদ্ধ এবং ভবিষ্যদ্বাণীযোগ্য পরিমাণ স্টোরেজ নষ্ট করতে পারে।
সুপারক্যাট

@ সুপের্যাট: আমার মন্তব্য সময়ের সাথে সাথে কোড পরিবর্তনের বিষয়ে কথা বলছিল। অবশ্যই, সীমাবদ্ধ পরিমাণের মেমরি ফাঁস করা কোনও সমস্যা নয়। তবে কোনও দিন, কারও কারও পক্ষে সেই ফাংশনটি পরিবর্তন করতে হবে যাতে এটি আর স্ট্যাটিক পয়েন্টার ব্যবহার না করে। কোডটিতে পয়েন্ট-টু মেমরিটি প্রকাশ করতে সক্ষম হওয়ার কোনও বিধান না থাকলে, এটি একটি কঠোর পরিবর্তন হতে চলেছে (বা আরও খারাপ, পরিবর্তনটি খারাপ হবে এবং আপনি একটি সীমাহীন ফাঁস শেষ করবেন)।
অ্যাড্রিয়ান ম্যাকার্থি

1
@ অ্যাড্রিয়ানম্যাকার্থি: স্ট্যাটিক পয়েন্টার ব্যবহার না করে কোডটি পরিবর্তন করার জন্য পয়েন্টারটিকে কিছুটা "প্রসঙ্গ" অবজেক্টে স্থানান্তর করা এবং এই জাতীয় অবজেক্ট তৈরি ও ধ্বংস করতে কোড যুক্ত করা প্রয়োজন। যদি পয়েন্টারটি সর্বদা nullথাকে তবে যদি কোনও বরাদ্দ উপস্থিত না থাকে এবং যখন কোনও বরাদ্দ উপস্থিত থাকে তখন নন-নাল, কোডটি বিনামূল্যে বরাদ্দ রাখে এবং nullপ্রসঙ্গটি ধ্বংস হওয়ার সময় পয়েন্টারটি সেট করা সহজ হবে, বিশেষত অন্য সমস্ত কিছুর সাথে তুলনা করা যা করা দরকার স্থির বস্তুগুলিকে প্রসঙ্গ কাঠামোয় স্থানান্তরিত করতে।
সুপারক্যাট

52

আপনি সঠিক, কোনও ক্ষতি করা হয়নি এবং কেবল প্রস্থান করার পক্ষে এটি দ্রুত

এর বিভিন্ন কারণ রয়েছে:

  • সমস্ত ডেস্কটপ এবং সার্ভার পরিবেশগুলি কেবল প্রস্থান () এ যাওয়ার সময় পুরো মেমরির স্থান ছেড়ে দেয়। তারা প্রোগ্রামের অভ্যন্তরীণ ডেটা স্ট্রাকচার যেমন হ্যাপগুলির বিষয়ে অজানা।

  • প্রায়শই সমস্ত free()বাস্তবায়ন অপারেটিং সিস্টেমে কখনই মেমরি ফিরিয়ে দেয় না।

  • আরও গুরুত্বপূর্ণ বিষয়, প্রস্থান করার ঠিক পূর্বে করা হয়ে গেলে এটি সময় নষ্ট করে। প্রস্থান করার সময়, মেমরি পৃষ্ঠাগুলি এবং অদলবদল স্থানটি সহজেই প্রকাশ করা হয়। বিপরীতে, ফ্রি () কলগুলির একটি সিরিজ সিপিইউ সময় বার করবে এবং এর ফলে ডিস্ক পেজিং অপারেশন, ক্যাশে মিস এবং ক্যাশে উচ্ছেদ হতে পারে।

সংক্রান্ত possiblility justifing পুনঃব্যবহারের ভবিষ্যৎ কোডের নিশ্চিতভাবে অর্থহীন অপস এর: একটি বিবেচনা যে কিন্তু এটি তর্কসাপেক্ষে না তত্পর উপায়। YAGNI!


2
আমি একবার এমন একটি প্রকল্পে কাজ করেছি যেখানে আমরা একটি প্রোগ্রামের মেমরির ব্যবহার বুঝতে চেষ্টা করার জন্য অল্প পরিমাণে সময় ব্যয় করি (আমাদের এটি সমর্থন করার প্রয়োজন ছিল, আমরা এটি লিখিনি)। অভিজ্ঞতার ভিত্তিতে আমি আপনার দ্বিতীয় বুলেটটির সাথে একাকীভাবে সম্মত। যাইহোক, আমি আপনাকে (বা কেউ) আরও সত্য প্রমাণ দিতে চাই যে এটি সত্য।
ব্যবহারকারী 106740

3
কিছু মনে করবেন না, উত্তরটি খুঁজে পেয়েছেন: stackoverflow.com/questions/1421491/… । তাই আপনাকে ধন্যবাদ!
ব্যবহারকারী 106740

@ অ্যাভিগিজিয়ানো যাকে YAGNI বলে।
v.oddou

YAGNI নীতি উভয় উপায়ে কাজ করে: আপনার কখনই শাটডাউন পথটিকে অনুকূল করতে হবে না। অকাল অপ্টিমাইজেশান এবং সমস্ত কিছু।
অ্যাড্রিয়ান ম্যাকার্থি

26

আমি ওপি সঠিক বলেছিলে বা ক্ষতি নেই এমন প্রত্যেকের সাথে আমি সম্পূর্ণরূপে একমত নই।

প্রত্যেকেই একটি আধুনিক এবং / অথবা লিগ্যাসি ওএস এর কথা বলছে।

তবে আমি যদি এমন কোনও পরিবেশে থাকি যেখানে আমার কেবল কোনও ওএস নেই? যেখানে কিছুই নেই?

এখন কল্পনা করুন আপনি থ্রেড স্টাইলযুক্ত বিঘ্ন ব্যবহার করছেন এবং মেমরি বরাদ্দ করুন। সি স্ট্যান্ডার্ড আইএসও / আইইসি তে: 9899 মেমোরির জীবনকাল হিসাবে বলা হয়েছে:

20.২০.৩ মেমরি পরিচালনা কার্যাদি

1 কলোক, ম্যালোক এবং রিলোক ফাংশনগুলিতে ক্রমাগত কলগুলি দ্বারা বরাদ্দকৃত স্টোরেজের ক্রম এবং সুনির্দিষ্টতা অনির্দিষ্ট। পয়েন্টারটি যদি বরাদ্দ সফল হয় যথাযথভাবে প্রান্তিককরণ করা হয় যাতে এটি কোনও ধরণের অবজেক্টের জন্য পয়েন্টারকে বরাদ্দ করা যেতে পারে এবং তারপরে বরাদ্দকৃত স্থানটিতে এই জাতীয় অবজেক্ট বা এই জাতীয় বস্তুর অ্যারে অ্যাক্সেস করতে ব্যবহৃত হয় (স্পেসটি স্পষ্টভাবে বিলোপ না হওয়া অবধি) । বরাদ্দ হওয়া অবজেক্টের জীবনকাল বরাদ্দ থেকে অবধি অবধি বিস্তৃত হয় [[...]

সুতরাং এটি দেওয়া হবে না যে পরিবেশটি আপনার জন্য নিখরচায় কাজ করছে। অন্যথায় এটি শেষ বাক্যে যুক্ত হবে: "অথবা প্রোগ্রামটি শেষ না হওয়া পর্যন্ত"।

সুতরাং অন্য কথায়: স্মৃতি মুক্ত না করা কেবল খারাপ অভ্যাস নয়। এটি নন পোর্টেবল এবং সি কনফর্ম কোডটি উত্পাদন করে। যা অন্তত নিম্নলিখিত হিসাবে সঠিক হিসাবে দেখা যেতে পারে: [...], পরিবেশ দ্বারা সমর্থিত '।

তবে আপনার ক্ষেত্রে কোনও ওএস নেই এমন ক্ষেত্রে, কেউ আপনার জন্য কাজ করছে না (আমি জানি সাধারণত এমবেড থাকা সিস্টেমে আপনি মেমরি বরাদ্দ করেন না এবং পুনরায় সেট করবেন না, তবে এমন ঘটনাও রয়েছে যেখানে আপনি চাইবেন))

সুতরাং সাধারণ প্লেইন সি (যেমন ওপি ট্যাগ করা হয়) বললে, এটি কেবল ভুল এবং বহনযোগ্য কোড তৈরি করছে।


4
একটি পাল্টা যুক্তি হ'ল আপনি যদি এমবেডেড পরিবেশ থাকেন তবে আপনি - বিকাশকারী হিসাবে - আপনার স্মৃতি পরিচালনায় প্রথমে অনেক বেশি উত্সাহী হয়ে উঠবেন। সাধারণত, এটি কোনও রানটাইম ম্যালোক / রিলোকগুলি আদৌ না করে আগে প্রাক-বরাদ্দ স্থির স্থির মেমরির বিন্দুতে।
জন গো-সোসো

1
@ লুনারপ্লাজমা: আপনি যা বলছেন তা ভুল না হলেও ভাষার মানগুলি কী বলেছে তা সত্যতা পরিবর্তন করে না এবং যে কেউ এর বিপরীতে / আরও কিছু করে, তারা সাধারণ জ্ঞানহীন হলেও সীমিত কোড তৈরি করছে is আমি বুঝতে পারি যে কেউ যদি বলেন "এটির আমার যত্ন নেওয়ার দরকার নেই", কারণ যথেষ্ট ক্ষেত্রে এটি ঠিক আছে cases তবে কারও অন্তত জানা উচিত কেন তার যত্ন নিতে হবে না। এবং বিশেষত যতক্ষণ না কোনও প্রশ্ন সেই বিশেষ মামলার সাথে সম্পর্কিত না হয় ততক্ষণ এটিকে বাদ দিন না। এবং যেহেতু ওপি তাত্ত্বিক (স্কুল) দিকের অধীনে সাধারণভাবে সি সম্পর্কে জিজ্ঞাসা করছে। "আপনার দরকার নেই" বলা ঠিক হবে না!
এএম

2
বেশিরভাগ পরিবেশে যেখানে ওএস নেই, এমন কোনও উপায় নেই যার মাধ্যমে প্রোগ্রামগুলি "সমাপ্ত" করতে পারে।
সুপারক্যাট

@ সুপের্যাট: যেমনটি আমি আগে লিখেছি: আপনি এ সম্পর্কে ঠিক বলেছেন। তবে কেউ যদি শিক্ষার কারণ এবং স্কুলের দিকগুলির বিষয়ে এটি সম্পর্কে জিজ্ঞাসা করছেন, তবে এটি বলা ঠিক হবে না "ভাষার এ শব্দটি ব্যবহার এবং আচরণ সংজ্ঞাটি একটি কারণে দেওয়া হয়েছে, এবং বেশিরভাগ পরিবেশ এটি আপনার পক্ষে পরিচালনা করে, আপনি এটি বলতে পারেন না যে যত্ন নেওয়ার দরকার নেই। আমার বক্তব্য।
dhein

2
সি স্ট্যান্ডার্ড উদ্ধৃত করার জন্য -১ এর বেশিরভাগটি অপারেটিং সিস্টেমের অভাবে প্রযোজ্য নয়, বিশেষত মেমরি পরিচালনা এবং স্ট্যান্ডার্ড লাইব্রেরি সংক্রান্ত কার্যাদি সম্পর্কিত বৈশিষ্ট্যগুলি সরবরাহ করার জন্য কোনও রানটাইম নেই (যা স্পষ্টত অনুপস্থিত) রানটাইম / ওএস সহ)।

23

আমি নিশ্চিত হয়েছি যে আমি প্রতিটি বরাদ্দকৃত ব্লকটি একবার প্রস্তুত করে নিই যে আমি এটি সম্পন্ন করেছি with আজ, আমার প্রোগ্রামের এন্ট্রি পয়েন্ট হতে পারে main(int argc, char *argv[])তবে আগামীকাল এটি foo_entry_point(char **args, struct foo *f)ফাংশন পয়েন্টার হিসাবে টাইপ এবং টাইপ হতে পারে ।

সুতরাং, যদি এটি হয়, আমার এখন একটি ফুটো আছে।

আপনার দ্বিতীয় প্রশ্ন সম্পর্কে, যদি আমার প্রোগ্রামটি একটি = 5 এর মতো ইনপুট নেয় তবে আমি একটির জন্য স্থান বরাদ্দ করব, বা একই স্থানটি পরবর্তী a = "foo" এ পুনরায় বরাদ্দ করব। এটি অবধি বরাদ্দ থাকবে:

  1. ব্যবহারকারী টাইপ করেছেন 'আনসেট এ'
  2. আমার ক্লিনআপ ফাংশনটি প্রবেশ করানো হয়েছিল, হয় একটি সংকেত পরিবেশন করা হয়েছে বা ব্যবহারকারী টাইপ করুন 'ছাড়ুন'

কোনও আধুনিক ওএসের কথা ভাবতে পারি না যা প্রক্রিয়াটি শেষ হয়ে যাওয়ার পরে মেমরিটিকে পুনরায় দাবি করে না। আবার, ফ্রি () সস্তা, কেন পরিষ্কার করা হচ্ছে না? অন্যরা যেমন বলেছে, ভালগ্র্যান্ডের মতো সরঞ্জামগুলি ফাঁস ফাঁসের জন্য দুর্দান্ত যা আপনার সত্যই উদ্বিগ্ন হওয়া উচিত। যদিও আপনি যে ব্লকগুলির উদাহরণ দিয়েছেন সেগুলি 'এখনও পৌঁছনীয়' হিসাবে লেবেলযুক্ত হবে, আপনি যখন কোনও ফাঁস নেই তা নিশ্চিত করার চেষ্টা করছেন তবে আউটপুটটিতে এটি কেবলমাত্র অতিরিক্ত গোলমাল।

আরেকটি রূপকথার কাহিনীটি হ'ল " যদি এটি প্রধান হয় () তবে আমাকে এটিকে মুক্ত করতে হবে না ", এটি ভুল। নিম্নোক্ত বিবেচনা কর:

char *t;

for (i=0; i < 255; i++) {
    t = strdup(foo->name);
    let_strtok_eat_away_at(t);
}

যদি এটি কাঁটাচামচ / ডিমনাইজিংয়ের আগে আসে (এবং তাত্ত্বিকভাবে চিরকালের জন্য চলমান থাকে), আপনার প্রোগ্রামটি সুনির্দিষ্ট আকারের 255 বার ফাঁস করেছে।

একটি ভাল, ভাল লিখিত প্রোগ্রাম সবসময় নিজের পরে পরিষ্কার করা উচিত। সমস্ত স্মৃতি মুক্ত করুন, সমস্ত ফাইল ফ্লাশ করুন, সমস্ত বর্ণনাকারী বন্ধ করুন, সমস্ত অস্থায়ী ফাইলগুলি লিঙ্কমুক্ত করুন ইত্যাদি এই ক্লিনআপ ফাংশনটি সাধারণ সমাপ্তির পরে বা বিভিন্ন ধরণের মারাত্মক সংকেত পাওয়ার পরে পৌঁছানো উচিত, যদি না আপনি কিছু ফাইল চারপাশে রেখে যেতে চান তবে আপনি পারেন একটি ক্র্যাশ সনাক্ত করুন এবং আবার শুরু করুন।

সত্যিই, দরিদ্র আত্মার প্রতি দয়া করুন যিনি আপনার জিনিসগুলি অন্য জিনিসগুলির দিকে চালিত করার সময় রক্ষণাবেক্ষণ করতে হবে .. এটি তাদেরকে 'ভালগ্রাইন্ড ক্লিন' দিয়ে দিন :) :)


1
এবং হ্যাঁ, আমি একবার একটি দল সহচর আমাকে বলুন ছিল: <শিহরিত অবস্থা> "আমি বিনামূল্যে () কল করার মেন () প্রয়োজন কখনও"
টিম পোস্ট

free() is cheapজটিল সম্পর্কের সাথে যদি আপনার এক বিলিয়ন ডেটা স্ট্রাকচার না থাকে যা আপনাকে একে একে প্রকাশ করতে হবে, সমস্ত কিছু প্রকাশের চেষ্টা করার জন্য ডেটা স্ট্রাকচারকে অতিক্রম করা আপনার শাট ডাউন সময়টিকে উল্লেখযোগ্যভাবে বাড়িয়ে তুলতে পারে, বিশেষত যদি ডেটা কাঠামোর অর্ধেক ইতিমধ্যে পৃষ্ঠপোষিত হয় কোনও সুবিধা ছাড়াই ডিস্কে।
মিথ্যা রায়ান

3
@ লাইরিয়ান যদি আপনার এক বিলিয়ন থাকে, যেমন আক্ষরিক অর্থে এক বিলিয়ন কাঠামো, আপনার সম্ভবত অন্যান্য সমস্যা রয়েছে যার জন্য বিশেষতর বিবেচনার প্রয়োজন রয়েছে - এই নির্দিষ্ট উত্তরের ক্ষেত্র ছাড়িয়ে :)
টিম পোস্ট

13

আপনি যখন প্রস্থান করবেন তখন মেমরিটিকে নিখরচায় ছেড়ে দেওয়া সম্পূর্ণ জরিমানা; malloc () "হিপ" নামক মেমরি অঞ্চল থেকে মেমরির বরাদ্দ করে এবং প্রক্রিয়াটি প্রস্থান করার পরে কোনও প্রক্রিয়ার সম্পূর্ণ হিপ মুক্ত হয়।

বলা হচ্ছে, লোকেরা এখনও বাইরে যাওয়ার আগে সমস্ত কিছু মুক্ত করার পক্ষে জোর দেওয়ার একটি কারণ হ'ল মেমোরি ডিবাগারগুলি (যেমন লিনাক্সে ভালগ্রিড) অদৃশ্য ব্লকগুলি মেমরি ফাঁস হিসাবে সনাক্ত করে এবং আপনার যদি "বাস্তব" মেমরি ফাঁস হয় তবে তা হয়ে যায় আপনি যদি শেষে "নকল" ফলাফল পান তবে তাদের স্পট করা আরও কঠিন।


1
"ফাঁস" এবং "এখনও পৌঁছনীয়" এর মধ্যে পার্থক্য করে কি ভালগ্রাইন্ড খুব ভাল কাজ করে না?
ক্রিস্টোফার

11
-1 "সম্পূর্ণ সূক্ষ্ম" এর জন্য বরাদ্দ মেমরিটি বিনামূল্যে না রেখে ছেড়ে দেওয়া খারাপ কোডিং অনুশীলন। যদি সেই কোডটি কোনও লাইব্রেরিতে বের করা হয়, তবে এটি পুরো জায়গা জুড়ে স্মৃতিচারণ করবে।
ডেভিনিবি

5
ক্ষতিপূরণ দেওয়ার জন্য +1। কমপি এর উত্তর দেখুন। freeসময়ে exitক্ষতিকারক হিসাবে বিবেচিত।
আর .. গীটহাব বন্ধ করুন ICE

11

আপনি যদি বরাদ্দ করা মেমরিটি ব্যবহার করে থাকেন তবে আপনি কোনও ভুল করছেন না। যখন আপনি ফাংশনগুলি (মূল ব্যতীত) লেখেন তখন এটি সমস্যা হয়ে দাঁড়ায় যা মেমরিটি নিখরচায় বরাদ্দ করে এবং আপনার প্রোগ্রামের বাকী অংশে এটি উপলব্ধ না করে। তারপরে আপনার প্রোগ্রামটি বরাদ্দ করা মেমরিটি দিয়ে চলতে থাকে তবে এটি ব্যবহারের কোনও উপায় নেই। আপনার প্রোগ্রাম এবং অন্যান্য চলমান প্রোগ্রামগুলি সেই স্মৃতি থেকে বঞ্চিত।

সম্পাদনা করুন: অন্যান্য চলমান প্রোগ্রামগুলি সেই স্মৃতি থেকে বঞ্চিত রয়েছে তা বলা 100% সঠিক নয়। অপারেটিং সিস্টেমটি সর্বদা আপনার প্রোগ্রামটিকে ভার্চুয়াল মেমোরি ( </handwaving>) এ অদলবদল করার জন্য ব্যয় করে এটি ব্যবহার করতে দিতে পারে । যদিও মুল বক্তব্যটি হ'ল যদি আপনার প্রোগ্রামটি মেমরিটিকে মুক্ত করে যে এটি ব্যবহার করছে না তবে ভার্চুয়াল মেমোরি অদলবদলের প্রয়োজনীয়তা কম।


11

এই কোডটি সাধারণত ঠিকঠাকভাবে কাজ করবে তবে কোড পুনরায় ব্যবহারের সমস্যাটি বিবেচনা করুন।

আপনি হয়ত কিছু কোড স্নিপেট লিখেছেন যা বরাদ্দ মেমরি মুক্ত করে না, এটি এমনভাবে চালানো হয় যাতে মেমরিটি স্বয়ংক্রিয়ভাবে পুনরায় দাবি করা হয়। ঠিক আছে মনে হচ্ছে।

তারপরে অন্য কেউ আপনার স্নিপেটটি তার প্রকল্পে এমনভাবে অনুলিপি করে যাতে এটি প্রতি সেকেন্ডে এক হাজার বার কার্যকর হয় uted সেই ব্যক্তিটির এখন তার প্রোগ্রামে একটি বিশাল মেমরি ফুটো হয়েছে। সাধারণভাবে খুব ভাল নয়, সাধারণত সার্ভার অ্যাপ্লিকেশনটির জন্য মারাত্মক।

কোড পুনর্ব্যবহার করা উদ্যোগগুলিতে সাধারণ। সাধারণত সংস্থাটি তার কর্মচারীদের তৈরি সমস্ত কোডের মালিক এবং প্রতিটি বিভাগ কোম্পানির মালিকানাধীন পুনরায় ব্যবহার করতে পারে। সুতরাং এই জাতীয় "নির্দোষভাবে চেহারা" কোড লিখে আপনি অন্য ব্যক্তির পক্ষে সম্ভাব্য মাথা ব্যাথা ঘটাচ্ছেন। এটি আপনাকে বরখাস্ত করতে পারে।


2
এটি স্নিপেটটি অনুলিপি করার জন্যই নয়, এমন একটি প্রোগ্রামের সম্ভাবনাটিও লক্ষণীয় যে এটি বার বার করার জন্য একবার সংশোধন করার পরে কিছু নির্দিষ্ট ক্রিয়া করার জন্য লেখা হয়েছিল। এরকম ক্ষেত্রে মেমরি একবার বরাদ্দ দেওয়া এবং তারপরে কখনও মুক্তি না পেয়ে বারবার ব্যবহার করা ঠিক হবে তবে প্রতিটি ক্রিয়াকলাপের জন্য স্মৃতি বরাদ্দ করা এবং পরিত্যাগ করা (এটি বিনা মুক্তে) বিপর্যয়কর হতে পারে।
সুপারক্যাট

7

এখানে আসল ফলাফল কি?

আপনার প্রোগ্রাম মেমরি ফাঁস। আপনার ওএসের উপর নির্ভর করে এটি পুনরুদ্ধার করা হতে পারে।

বেশিরভাগ আধুনিক ডেস্কটপ অপারেটিং সিস্টেম কি প্রক্রিয়া পরিসমাপ্তি এ ফাঁস স্মৃতি ফিরিয়ে, এটা দুঃখিতভাবে সাধারণ, সমস্যা উপেক্ষা করা এখানে অনেক অন্যান্য উত্তর দ্বারা দেখা যায় উপার্জন।)

কিন্তু আপনি একটি নিরাপত্তা বৈশিষ্ট্য আপনার উপর নির্ভর করা উচিত নয় উপর নির্ভর করা হয়, এবং আপনার প্রোগ্রাম (অথবা ফাংশন) একটি সিস্টেম যেখানে এই আচরণের উপর চালানো হতে পারে না একটি "কঠিন" মেমরি লিক, এ ফলাফলের পরবর্তী সময়।

আপনি হয়ত কার্নেল মোডে বা ভিনটেজ / এমবেডেড অপারেটিং সিস্টেমগুলিতে চলছেন যা মেমোরি সুরক্ষা ট্রেডঅফ হিসাবে ব্যবহার করে না। (এমএমইউগুলি ডাই স্পেস নেয়, মেমরির সুরক্ষা অতিরিক্ত সিপিইউ চক্রের জন্য ব্যয় করে এবং কোনও প্রোগ্রামারকে নিজের পরে পরিষ্কার করার জন্য জিজ্ঞাসা করা খুব বেশি নয়)।

আপনি যেভাবে চান মেমোরিটি ব্যবহার করতে এবং পুনরায় ব্যবহার করতে পারেন, তবে নিশ্চিত হয়ে নিন আপনি প্রস্থান করার আগে সমস্ত সংস্থান হ্রাস পেয়েছেন।


5

অপারেটিং সিস্টেমে স্নাতক কোর্সের জন্য ওএসটিইপি অনলাইন পাঠ্যপুস্তকে আসলে একটি বিভাগ রয়েছে যা আপনার প্রশ্নটি ঠিক আলোচনা করে।

সম্পর্কিত বিভাগটি পৃষ্ঠায় মেমরি এপিআই অধ্যায়টির "স্মৃতি মুক্ত করতে ভুলে যাওয়া" যা নিম্নলিখিত ব্যাখ্যাটি দেয়:

কিছু ক্ষেত্রে এটি ফ্রি () কল না করা যুক্তিসঙ্গত বলে মনে হতে পারে। উদাহরণস্বরূপ, আপনার প্রোগ্রামটি স্বল্পস্থায়ী এবং শীঘ্রই প্রস্থান করবে; এই ক্ষেত্রে, প্রক্রিয়াটি মারা যাওয়ার পরে, ওএস তার বরাদ্দকৃত সমস্ত পৃষ্ঠাগুলি পরিষ্কার করে দেবে এবং এইভাবে কোনও মেমরি ফাঁস হবে না। এটি অবশ্যই "কাজ করে" (page পৃষ্ঠার একপাশে দেখুন), সম্ভবত এটি বিকাশের একটি খারাপ অভ্যাস, সুতরাং এই জাতীয় কৌশলটি বেছে নেওয়ার বিষয়ে সতর্ক থাকুন

এই অংশটি ভার্চুয়াল মেমরির ধারণাটি প্রবর্তনের প্রসঙ্গে। মূলত বইয়ের এই মুহুর্তে, লেখকরা ব্যাখ্যা করেছেন যে একটি অপারেটিং সিস্টেমের অন্যতম লক্ষ্য হ'ল "ভার্চুয়ালাইজ মেমরি," যা প্রতিটি প্রোগ্রামকে বিশ্বাস করতে দেয় যে এটির একটি খুব বড় মেমরি ঠিকানার জায়গাতে অ্যাক্সেস রয়েছে।

পর্দার আড়ালে, অপারেটিং সিস্টেমটি শারীরিক স্মৃতিতে নির্দেশিত প্রকৃত ঠিকানাগুলিতে ব্যবহারকারী "ভার্চুয়াল ঠিকানাগুলি" অনুবাদ করবে।

তবে শারীরিক মেমরির মতো সংস্থানগুলি ভাগ করে নেওয়ার জন্য অপারেটিং সিস্টেমটি কী প্রক্রিয়াগুলি ব্যবহার করছে তা ট্র্যাক করে রাখতে হবে। সুতরাং যদি কোনও প্রক্রিয়া শেষ হয়ে যায়, তবে প্রক্রিয়াটির স্মৃতি পুনরায় দাবি করা অপারেটিং সিস্টেমের ক্ষমতা এবং নকশার লক্ষ্যগুলির মধ্যে রয়েছে যাতে এটি পুনরায় বিতরণ করতে পারে এবং অন্যান্য প্রক্রিয়াগুলির সাথে স্মৃতি ভাগ করে নিতে পারে।


সম্পাদনা: অংশে উল্লিখিত একপাশে নীচে অনুলিপি করা হয়েছে।

সংযুক্তি: আপনার প্রক্রিয়াটি শেষ হয়ে গেলে কোনও স্মৃতি কেন পড়ে না

আপনি যখন একটি স্বল্প-কালীন প্রোগ্রাম লিখেন, আপনি সম্ভবত কিছু স্থান বরাদ্দ করতে পারেন malloc()। প্রোগ্রামটি চলমান এবং শেষ হতে চলেছে: free()প্রস্থান করার ঠিক আগে কি একগুচ্ছ বার কল করার দরকার আছে ? যদিও এটি ভুল না বলে মনে হচ্ছে, কোনও স্মৃতি কোনও সত্য অর্থে "নষ্ট" হবে না। কারণটি সহজ: সিস্টেমে মেমরি ম্যানেজমেন্টের দুটি স্তর রয়েছে। মেমরি পরিচালনার প্রথম স্তরেরটি ওএস দ্বারা সঞ্চালিত হয়, যা মেমরিগুলি চালনার সময় প্রসেসগুলিতে হস্তান্তর করে এবং প্রসেসগুলি প্রস্থান করার সময় (বা অন্যথায় মারা যায়) আবার ফিরিয়ে নিয়ে যায়। পরিচালনার দ্বিতীয় স্তরটি প্রতিটি প্রক্রিয়াটির মধ্যে থাকে, উদাহরণস্বরূপ যখন আপনি কল করেন malloc()এবং তখন theালার মধ্যে থাকে free()। এমনকি যদি আপনি কল করতে ব্যর্থ হনfree()(এবং এইভাবে গাদা মধ্যে মেমরি ফাঁস), অপারেটিং সিস্টেম প্রোগ্রামটি শেষ হওয়ার পরে প্রক্রিয়াটির সমস্ত মেমরির (কোড, স্ট্যাক এবং এখানে প্রাসঙ্গিক হিসাবে হ্যাপের জন্য সেই পৃষ্ঠা সহ) পুনরায় দাবি জানাবে। আপনার ঠিকানার জায়গায় আপনার স্তূপের কী অবস্থা তা বিবেচনাধীন, প্রক্রিয়াটি মারা যাওয়ার পরে ওএস pages সমস্ত পৃষ্ঠাগুলি ফিরিয়ে নেয়, সুতরাং এটি নিশ্চিত করে যে আপনি এটিকে মুক্ত করেন নি তা সত্ত্বেও কোনও স্মৃতি হারিয়ে না যায়।

সুতরাং, স্বল্প-স্থায়ী প্রোগ্রামগুলির জন্য, মেমরি ফাঁস হওয়ার ফলে প্রায়শই কোনও অপারেশনাল সমস্যা দেখা দেয় না (যদিও এটি দুর্বল রূপ হিসাবে বিবেচিত হতে পারে)। আপনি যখন দীর্ঘ-চলমান সার্ভারটি লিখেন (যেমন কোনও ওয়েব সার্ভার বা ডাটাবেস ম্যানেজমেন্ট সিস্টেম, যা কখনই প্রস্থান হয় না), ফাঁস মেমরিটি অনেক বড় সমস্যা এবং অ্যাপ্লিকেশনটির স্মৃতিশক্তি শেষ না হয়ে শেষ পর্যন্ত ক্র্যাশ ঘটায়। এবং অবশ্যই, মেমরি ফাঁস একটি নির্দিষ্ট প্রোগ্রামের মধ্যে একটি আরও বড় সমস্যা: নিজেই অপারেটিং সিস্টেম। আমাদের আবারও দেখানো হচ্ছে: যারা কার্নেল কোড লেখেন তাদের সবার কাছে সবচেয়ে কঠিন কাজ ...

এর মেমরি এপিআই অধ্যায়ের পৃষ্ঠা 7 থেকে

অপারেটিং সিস্টেম: তিনটি সহজ টুকরো
রিমজি এইচ। আরপাসি-ডাসাও এবং আন্দ্রেয়া সি। আরপাচি-ডাসাউ আরপাসি-ডাসাও বই মার্চ, ২০১৫ (সংস্করণ ০.৯৯)


4

আপনার ভেরিয়েবলগুলি মুক্ত না করার ক্ষেত্রে সত্যিকারের কোনও বিপদ নেই , তবে আপনি যদি প্রথম ব্লকটি মুক্ত না করে মেমরির একটি ব্লকে মেমরির একটি ব্লকে একটি পয়েন্টার বরাদ্দ করেন তবে প্রথম ব্লকটি আর অ্যাক্সেসযোগ্য নয় তবে এখনও স্থান নেয় takes এটিকে মেমোরি ফুটো বলা হয় এবং আপনি যদি নিয়মিততার সাথে এটি করেন তবে আপনার প্রক্রিয়াটি আরও প্রক্রিয়া থেকে অন্যান্য প্রক্রিয়া থেকে সিস্টেমের সংস্থানগুলি সরিয়ে নিয়ে আরও বেশি পরিমাণে স্মৃতি গ্রহণ শুরু করবে।

প্রক্রিয়াটি যদি স্বল্প-স্থায়ী হয় তবে আপনি প্রায়শই এটি করে দূরে যেতে পারেন কারণ প্রক্রিয়াটি সম্পূর্ণ হওয়ার পরে সমস্ত বরাদ্দ মেমরি অপারেটিং সিস্টেম দ্বারা পুনরুদ্ধার করা হয়, তবে আমি আপনাকে আর সমস্ত ব্যবহারের স্মৃতি মুক্ত করার অভ্যাসে পরামর্শ দেব।


1
আমি আপনার প্রথম বিবৃতিটির জন্য -1 বলতে চাই "কোনও বিপদ নেই" ব্যতীত আপনি তার পরে কেন বিপদ রয়েছে সে সম্পর্কে একটি চিন্তাশীল উত্তর দিন।
ডেভিনিবি

2
বিপদগুলি যেহেতু এটি বেশ সৌম্য - আমি কোনও সেগফোল্টের যেকোন দিন একটি স্মৃতি ফাঁস করব।
কাইল ক্রোনিন

1
খুব সত্য, এবং আমরা দুজনই পছন্দ করি না = ডি
ডিভিনবি

2
@KyleCronin আমি চাই অনেক বরং, কারণ উভয় গুরুতর বাগ এবং segfaults সনাক্ত করতে সহজ হয় একটি মেমরি লিক চেয়ে একটি segfault আছে। সবসময় প্রায়শই মেমোরি ফাঁস হয় না মনোযোগবিহীন বা অমীমাংসিত হয়ে যায় কারণ তারা "বেশ সৌখিন"। আমার র‌্যাম এবং আমি আন্তরিকভাবে একমত নই।
ড্যান বেচার্ড

@ ড্যান একটি বিকাশকারী হিসাবে, নিশ্চিত। ব্যবহারকারী হিসাবে, আমি মেমরি ফুটো করব। আমার কাছে বরং সফ্টওয়্যার থাকতে হবে যা মেমরি ফাঁস হওয়া সত্ত্বেও যে সফটওয়্যারটি না করে over
কাইল ক্রোনিন

3

আপনি এই ক্ষেত্রে একেবারে সঠিক। ক্ষুদ্র তুচ্ছ প্রোগ্রামগুলিতে যেখানে প্রোগ্রামের মৃত্যুর আগ পর্যন্ত একটি পরিবর্তনশীল উপস্থিত থাকতে হবে, মেমরিটি হ্রাস করার কোনও সত্যিকারের সুবিধা নেই।

প্রকৃতপক্ষে, আমি একবার এমন একটি প্রকল্পের সাথে জড়িত ছিলাম যেখানে প্রোগ্রামটির প্রতিটি সম্পাদন অত্যন্ত জটিল তবে তুলনামূলকভাবে স্বল্পস্থায়ী ছিল এবং সিদ্ধান্তটি ছিল কেবল স্মৃতি বরাদ্দ রাখা এবং প্রকল্পটিকে হ্রাসকারী ভুল করে অস্থিতিশীল না করা।

বলা হচ্ছে, বেশিরভাগ প্রোগ্রামে এটি আসলে কোনও বিকল্প নয়, বা এটি আপনাকে স্মৃতি থেকে দূরে সরিয়ে নিয়ে যেতে পারে।


2

আপনি সঠিক, প্রক্রিয়াটি প্রস্থান করার পরে মেমরিটি স্বয়ংক্রিয়ভাবে মুক্ত হয়। প্রক্রিয়াটি শেষ হয়ে গেলে কিছু লোক ব্যাপক পরিচ্ছন্নতা না করার চেষ্টা করে, কারণ এটি সমস্ত অপারেটিং সিস্টেমে ত্যাগ করা হবে। তবে, আপনার প্রোগ্রামটি চলাকালীন আপনার অব্যবহৃত মেমরিটি মুক্ত করা উচিত। যদি আপনি এটি না করেন তবে আপনার কার্যকরী সেটটি খুব বড় হয়ে গেলে আপনি শেষ পর্যন্ত দৌড়াতে পারেন বা অতিরিক্ত পেজিংয়ের কারণ হতে পারেন।


2

আপনি যদি স্ক্র্যাচ থেকে কোনও অ্যাপ্লিকেশন বিকাশ করছেন তবে কখন ফ্রি কল করবেন সে সম্পর্কে আপনি কিছু শিক্ষিত পছন্দ করতে পারেন। আপনার উদাহরণ প্রোগ্রামটি দুর্দান্ত: এটি মেমরির বরাদ্দ দেয়, সম্ভবত আপনি এটি কয়েক সেকেন্ডের জন্য কাজ করেছেন এবং তারপরে এটি দাবি করা সমস্ত সংস্থান মুক্ত করে বন্ধ করে দেয়।

আপনি যদি অন্য কিছু লিখছেন, যদিও - একটি সার্ভার / দীর্ঘ-চলমান অ্যাপ্লিকেশন, বা অন্য কারও দ্বারা ব্যবহৃত একটি লাইব্রেরি, আপনার ম্যালোক করা সমস্ত কিছুতে আপনার ফ্রি কল করার আশা করা উচিত।

এক সেকেন্ডের জন্য ব্যবহারিক দিকটি উপেক্ষা করা, আরও কঠোর পদ্ধতির অনুসরণ করা আরও নিরাপদ এবং নিজেকে মেলোক থেকে সমস্ত কিছু মুক্ত করার জন্য নিজেকে বাধ্য করা। আপনি যখনই কোড করবেন মেমরি ফাঁস দেখার অভ্যাস না থাকলে আপনি সহজেই কয়েকটি ফাঁস বসিয়ে দিতে পারেন। সুতরাং অন্য কথায়, হ্যাঁ - আপনি এটি ছাড়া পালাতে পারেন; তবে সাবধান হন


0

যদি কোনও প্রোগ্রাম অপারেটিং সিস্টেমটি প্রস্থান করার আগে কয়েকটি মেগাবাইট মুক্ত করতে ভুলে যায় তবে সেগুলি মুক্ত করে দেবে। তবে যদি আপনার প্রোগ্রামটি একসাথে কয়েক সপ্তাহ ধরে চলতে থাকে এবং প্রোগ্রামের অভ্যন্তরে একটি লুপ প্রতিটি পুনরাবৃত্তির কয়েকটি বাইট মুক্ত করতে ভুলে যায় তবে আপনার একটি শক্তিশালী মেমরি ফাঁস হবে যা আপনার কম্পিউটারের সমস্ত উপলব্ধ মেমরি খেয়ে ফেলবে যদি না আপনি এটি নিয়মিত পুনরায় চালু না করেন ভিত্তি => এমনকি ছোট মেমরি ফাঁসগুলি খারাপ হতে পারে যদি প্রোগ্রামটি যদি প্রাথমিকভাবে এটির জন্য ডিজাইন না করা হয় তবে কোনও গুরুতর বড় কাজের জন্য ব্যবহৃত হয়।


-2

আমি মনে করি যে আপনার দুটি উদাহরণ আসলে একটি মাত্র: free()প্রক্রিয়াটি কেবলমাত্র শেষে শেষ হওয়া উচিত, যা আপনি উল্লেখ করেছেন যে প্রক্রিয়াটি সমাপ্ত হচ্ছে সেহেতু এটি অকেজো।

যদিও আপনার দ্বিতীয় উদাহরণে, কেবলমাত্র পার্থক্য হ'ল আপনি একটি অপরিজ্ঞাত সংখ্যাকে মঞ্জুরি দেন malloc()যা মেমরি থেকে দূরে সরে যেতে পারে। পরিস্থিতি সামাল দেওয়ার একমাত্র উপায় হ'ল রিটার্ন কোডটি পরীক্ষা করে malloc()সেই অনুসারে কাজ করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.