একটি সি ++ কোড / প্রকল্পে মেমরি ফাঁস কীভাবে পাবেন?


180

আমি উইন্ডোজ প্ল্যাটফর্মের একজন সি ++ প্রোগ্রামার। আমি ভিজুয়াল স্টুডিও 2008 ব্যবহার করছি।

আমি সাধারণত কোডটিতে মেমরি ফুটো দিয়ে শেষ করি।

সাধারণত কোডটি পরিদর্শন করে আমি মেমরি ফুটো দেখতে পাই তবে এটি জটিল and এবং এটি সর্বদা ভাল পদ্ধতির নয়।

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

  1. আমি জানতে চাই যে প্রোগ্রামার কীভাবে মেমরি ফাঁস খুঁজে পেতে পারে।
  2. প্রোগ্রামটিতে কোনও মেমরি ফাঁস নেই তা নিশ্চিত করার জন্য কি কোনও মানদণ্ড বা পদ্ধতি অনুসরণ করা উচিত?

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

অনুরুপগুলি বিষয় বেশ কয়েকটি প্রশ্ন, মত দ্বারা আচ্ছাদিত stackoverflow.com/questions/1502799/... এবং stackoverflow.com/questions/2820223/...
HostileFork বলেছেন Dont ট্রাস্ট দঃপূঃ

1
@ হোস্টাইল ফর্ক: "কীভাবে সাধারণত মেমরি ফাঁসের কোডে শেষ হওয়া এড়ানো যায় " এই উত্তরগুলির দ্বারা কভার করা যায় না।
ডক ব্রাউন

2
@Doc ব্রাউন: যে আপ খুঁজছেন খুব পূর্ণ যতি নাই, কিন্তু এটি সকল যেমন অন্যত্র আবৃত, এর stackoverflow.com/questions/45627/...
HostileFork বলেছেন Dont ট্রাস্ট দঃপূঃ

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

উত্তর:


269

নির্দেশনা

আপনার যা প্রয়োজন

  • সি ++ এ দক্ষতা
  • সি ++ সংকলক
  • ডিবাগার এবং অন্যান্য তদন্তকারী সফ্টওয়্যার সরঞ্জাম

1

অপারেটরের বুনিয়াদি বুঝতে হবে। সি ++ অপারেটর newহ্যাপ মেমরি বরাদ্দ করে। deleteঅপারেটর মুক্ত গাদা মেমরি। প্রত্যেকের জন্য new, আপনার এমন একটি ব্যবহার করা উচিত deleteযাতে আপনার বরাদ্দ করা একই মেমরিটি মুক্ত করে:

char* str = new char [30]; // Allocate 30 bytes to house a string.

delete [] str; // Clear those 30 bytes and make str point nowhere.

2

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

char* str = new char [30]; // Give str a memory address.

// delete [] str; // Remove the first comment marking in this line to correct.

str = new char [60]; /* Give str another memory address with
                                                    the first one gone forever.*/

delete [] str; // This deletes the 60 bytes, not just the first 30.

3

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

char* str1 = new char [30];

char* str2 = new char [40];

strcpy(str1, "Memory leak");

str2 = str1; // Bad! Now the 40 bytes are impossible to free.

delete [] str2; // This deletes the 30 bytes.

delete [] str1; // Possible access violation. What a disaster!

4

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

void Leak(int x){

char* p = new char [x];

// delete [] p; // Remove the first comment marking to correct.

}

5

"মুছুন" পরে স্কোয়ার ধনুর্বন্ধনীগুলিতে মনোযোগ দিন। deleteএকটি একক অবজেক্টকে মুক্ত করতে নিজেই ব্যবহার করুন । delete []একটি হিপ অ্যারে মুক্ত করতে বর্গাকার বন্ধনীর সাহায্যে ব্যবহার করুন । এর মতো কিছু করবেন না:

char* one = new char;

delete [] one; // Wrong

char* many = new char [30];

delete many; // Wrong!

6

যদি ফাঁসটি এখনও অনুমোদিত হয় - আমি সাধারণত মুছে ফেলার সাথে এটি সন্ধান করি (এটি এখানে দেখুন: http://deleaker.com )।


3
প্রশ্ন-মন্তব্যের জন্য দুঃখিত তবে পয়েন্টার ছাড়াই ফাংশন পরামিতিগুলির কী হবে? someFunction("some parameter")আমি মুছে দিতে হবে না "some parameter"যে someFunction, ফাংশন কল পরে অথবা এই স্বয়ংক্রিয়ভাবে মুছে ফেলা হয়?
19greg96

1
ডেলিকারের লিঙ্কটির জন্য আপনাকে ধন্যবাদ, ভিজ্যুয়াল স্টুডিওতে ঝরঝরে ইন্টিগ্রেশন সহ এটি একটি সত্যই সহজ সরঞ্জাম। আমি এটি ব্যবহার করে অনেক সময় বাঁচাতে পারতাম। আমাকে সেই লাইনে নির্দেশ করে যেখানে আমি মেমরি বরাদ্দ করেছি এবং এটি মুক্ত করে নি। গ্রেট। এবং এটি সস্তা, আমি খুঁজে পাওয়া অন্যান্য মেমরি ফাঁস অনুসন্ধানকারীদের সাথে তুলনা করি।
এটি.আমি নিজে

@ জন স্মিথ plz ব্যাখ্যা করেছেন কেস 3 এর মতো মামলাগুলি হ্যান্ডেল করার উপযুক্ত উপায় কী; str2 = str1; // খারাপ! এখন 40 বাইট মুক্ত করা অসম্ভব। কিভাবে 1 টি 1 টি মুছবেন ??
নিহার

1
যদি আমরা চর *, ইনট, ফ্লোট, ... এবং ভেক্টর, সিএসট্রিংয়ের মতো স্ট্রাক্ট ব্যবহার করি এবং কোনও 'নতুন' অপারেটর ব্যবহার না করি তবে এটি মেমরি ফাঁস হওয়ার কারণ নয়, তাই না?
123iamking

আমি 14 বছর কাছাকাছি সময়ে আমি সি ++ স্পর্শ করিনি বলে এখানে এসেছি ... তবে আমি গর্বিত হয়েছি যে আমি বুঝতে পেরেছি এবং স্মরণ করছি যে আমি এখনও যে সি ++ বইয়ের অধিকারী এবং যখন পড়তে পারি তখন কীভাবে ধন্যবাদ জানাতে পারি ' আমি সি # সাথে উদাস। সেই বইটি স্কট মিচেলের কার্যকর সি ++। Godশ্বর আমি বইটি পছন্দ করতাম। ধন্যবাদ স্কট!
জোনএইচ

33

মেমরি ফাঁস সনাক্ত করতে আপনি আপনার কোডে কিছু কৌশল ব্যবহার করতে পারেন। সবচেয়ে সাধারণ এবং সবচেয়ে সহজ উপায় সনাক্ত করতে একটি ম্যাক্রো বলুন, DEBUG_NEW সংজ্ঞায়িত এটি ব্যবহার, মত পূর্বনির্ধারিত ম্যাক্রো সহ, হয় __FILE__এবং __LINE__আপনার কোডে মেমরি লিক খোজা। এই পূর্বনির্ধারিত ম্যাক্রোগুলি আপনাকে মেমরি ফাঁসের ফাইল এবং লাইন নম্বর বলে দেয়।

DEBUG_NEW কেবলমাত্র একটি ম্যাক্রো যা সাধারণত হিসাবে সংজ্ঞায়িত হয়:

#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW

যাতে আপনি যেখানেই ব্যবহার করুন না কেন new, এটি ফাইল এবং লাইন নম্বরও ট্র্যাক করতে পারে যা আপনার প্রোগ্রামে মেমরি ফাঁস সনাক্ত করতে ব্যবহৃত হতে পারে।

আর __FILE__, __LINE__হয় ম্যাক্রো পূর্বনির্ধারিত যা যথাক্রমে ফাইলের নাম এবং লাইন সংখ্যা নির্ণয় করা যেখানে আপনি তাদের ব্যবহার!

নিম্নলিখিত নিবন্ধটি পড়ুন যা খুব আকর্ষণীয়ভাবে অন্যান্য আকর্ষণীয় ম্যাক্রোগুলির সাথে DEBUG_NEW ব্যবহারের কৌশল ব্যাখ্যা করে:

একটি ক্রস-প্ল্যাটফর্ম মেমরি লিক সনাক্তকারী


উইকপিডিয়া থেকে ,

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


4
এটি #defineওভারলোড operator newহওয়া এবং সংকলক ত্রুটিগুলি জাগ্রত করবে। এমনকি যদি আপনি এটি অতিক্রম করতে সফল হন তবে তবুও অতিরিক্ত লোড ফাংশনগুলিকে সম্বোধন করা হবে না। যদিও কৌশলটি ভাল তবে এর মধ্যে অনেক সময় কোডের প্রচুর পরিবর্তন প্রয়োজন।
iammilind

1
@ আইয়ামিলিন্ড: অবশ্যই, এই কৌশলটি সমস্ত সেটগুলির সার-নিরাময় সমাধান নয় এবং অবশ্যই সব পরিস্থিতিতে কার্যকর নয়।
নওয়াজ

@Chris_vr: auto_ptrযেমন মান পাত্রে সাথে কাজ করবে না std::vector, std::list: ইত্যাদি এই দেখুন stackoverflow.com/questions/111478/...
নওয়াজ

ঠিক আছে ভদ্র. ফাইল এবং লাইন বর্ণিত হয়। operator newআপনি যেটি ব্যবহার করছেন তার এই সংস্করণগুলি কী এবং কী কী ?

14

কিছু বিখ্যাত প্রোগ্রামিং কৌশল রয়েছে যা আপনাকে প্রথমদিকে মেমরি ফাঁস হওয়ার ঝুঁকি হ্রাস করতে সহায়তা করবে:

  • যদি আপনার নিজের গতিশীল মেমরির বরাদ্দ করতে হয়, লিখুন newএবং deleteসর্বদা যুগলভাবে লিখুন এবং নিশ্চিত করুন যে বরাদ্দ / অবলম্বন কোডটিকে জোড়াযুক্ত বলা হয়
  • আপনি যদি পারেন গতিশীল মেমরি বরাদ্দ এড়ানো। উদাহরণস্বরূপ, এর vector<T> tপরিবর্তে যেখানেই সম্ভব যেকোন জায়গা ব্যবহার করুনT* t = new T[size]
  • বুস্ট স্মার্ট পয়েন্টারগুলির মতো "স্মার্ট পয়েন্টার" ব্যবহার করুন ( http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/smart_ptr.htm )
  • আমার ব্যক্তিগত প্রিয়: নিশ্চিত করুন যে আপনি পয়েন্টারের মালিকানার ধারণাটি বুঝতে পেরেছেন এবং নিশ্চিত করে নিন যে যেখানেই আপনি পয়েন্টার ব্যবহার করেন, আপনি জানেন যে কোন কোড সত্তার মালিক তা
  • কোন কনস্ট্রাক্টর / অ্যাসাইনমেন্ট অপারেটরগুলি সি ++ কম্পাইলার দ্বারা স্বয়ংক্রিয়ভাবে তৈরি করা হয়েছে তা শিখুন এবং এর অর্থ কী, যদি আপনার পয়েন্টারের মালিকানাধীন শ্রেণি থাকে (বা এর অর্থ কী যার অর্থ যদি কোনও ক্লাস থাকে যা কোনও অবজেক্টের পয়েন্টার ধারণ করে না তবে এটির মালিক নয় )।

আমি কোনও অবজেক্টের অট_পয়েন্টার ব্যবহার করি তার অর্থ এটি এর ভিতরে থাকা সমস্ত শ্রেণীর অবজেক্ট পয়েন্টারটিকে মুছে ফেলবে।
ক্রিস_ভিআর

@ ক্রিস_ভিআর: অটো_পয়েন্টার সম্পর্কে আপনার যদি নির্দিষ্ট প্রশ্ন থাকে তবে আমি আপনাকে একটি উদাহরণ সহ একটি নতুন প্রশ্ন করার পরামর্শ দিচ্ছি।
ডক ব্রাউন

অনেক পোস্ট আমাকে জানান যে ভেক্টর <> মেমরি পরিষ্কার হওয়ার পরে মুক্ত হওয়ার গ্যারান্টি দেয় না। আমি ব্যক্তিগতভাবে অদলবদল ইত্যাদির পরীক্ষা করেছি এবং আমি এই সিদ্ধান্তে পৌঁছেছি যে ভেক্টর <> বিশেষত যখন গতিশীলভাবে ব্যবহৃত হয় তখন ফাঁস হয়। আমি বুঝতে পারছি না কীভাবে ভেক্টর <> নিজেই 'নতুন' এবং পরিষ্কারভাবে সঠিকভাবে ক্লিনআপ ব্যবহার করে ডায়নামিক বরাদ্দের মাধ্যমে পরামর্শ দেওয়া যেতে পারে। আমার এম্বেড থাকা প্রোগ্রামগুলিতে আমি সমস্ত ফাঁসের কারণে গতিশীল স্টাফগুলির জন্য ভেক্টর <> ব্যবহার করা এড়াতে পারি। সেখানে আমি নতুন বা স্টাডি :: তালিকা ব্যবহার করব
বার্ট এস

অক্ষরের সংখ্যার কারণে আমি একটি দ্বিতীয় কমান্ড টাইপ করি। দুর্ভাগ্যক্রমে আমার এম্বেড থাকা সি ++ এ আমার একটি পুরানো সি ++ (98?) রয়েছে যা ভেক্টরে সঙ্কুচিত_টো_ফিট নেই ... তবে এম্বেডড প্রোগ্রামটি ভেক্টর <> গতিশীলভাবে ব্যবহার করে মেমরি থেকে চালিত হওয়ার সময় সম্পূর্ণ ক্র্যাশ হতে 100% নিশ্চিত
বার্ট এস


8
  1. উইন্ডোজের জন্য ডিবাগিং সরঞ্জামগুলি ডাউনলোড করুন ।
  2. gflagsব্যবহারকারী-মোড স্ট্যাক ট্রেসগুলি চালু করতে ইউটিলিটিটি ব্যবহার করুন ।
  3. UMDHআপনার প্রোগ্রামের মেমরির একাধিক স্ন্যাপশট নিতে ব্যবহার করুন Use মেমরি বরাদ্দ হওয়ার আগে একটি স্ন্যাপশট নিন এবং এমন একটি পয়েন্টের পরে একটি দ্বিতীয় স্ন্যাপশট নিন যা আপনি বিশ্বাস করেন যে আপনার প্রোগ্রামটি মেমরি ফাঁস করেছে। আপনাকে দৌড়ানোর UMDHএবং স্ন্যাপশট নেওয়ার সুযোগ দেওয়ার জন্য আপনি আপনার প্রোগ্রামটিতে বিরতি বা প্রম্পট যুক্ত করতে চাইতে পারেন ।
  4. চালান UMDHআবার, যে দুটি স্ন্যাপশট মধ্যে একটি পরিবর্তন করে তার মোডে এই সময়। এটি তখন সন্দেহজনক মেমরি ফাঁসের কল স্ট্যাক সহ একটি প্রতিবেদন তৈরি করবে।
  5. আপনার gflagsকাজ শেষ হয়ে গেলে আপনার পূর্ববর্তী সেটিংস পুনরুদ্ধার করুন ।

UMDHআপনাকে সিআরটি ডিবাগ হ্যাপের চেয়ে আরও তথ্য দেবে কারণ এটি আপনার পুরো প্রক্রিয়া জুড়ে মেমরির বরাদ্দ দেখছে; এটি তৃতীয় পক্ষের উপাদানগুলি ফাঁস হচ্ছে কিনা তাও আপনাকে বলতে পারে।


1
আমি স্ট্যান্ডার্ড প্রোফাইলারের পরিবর্তে ডিলিকার এবং ভালগ্রাইন্ডকে পছন্দ করি
z0r1fan

8

"ভালগ্রাইন্ড" চালানো যায়:

1) মেমরি ফুটো সনাক্তকরণে সহায়তা করুন - আপনার কত স্মৃতি ফাঁস হয়েছে তা আপনাকে দেখান এবং লিক করা মেমরিটি যে বরাদ্দ করা হয়েছিল সেই কোডের লাইনগুলিকে নির্দেশ করুন।

২) স্মৃতি মুক্ত করার জন্য ভুল প্রচেষ্টা চিহ্নিত করুন (যেমন: অনুপযুক্ত কল delete)

"ভালগ্রাইন্ড" ব্যবহারের জন্য নির্দেশাবলী

1) Valgrind পান এখানে

২) -gপতাকা সহ আপনার কোডটি সংকলন করুন

3) আপনার শেল রান:

valgrind --leak-check=yes myprog arg1 arg2

যেখানে "মাইপ্রোগ" হ'ল আপনার সংকলিত প্রোগ্রাম এবং arg1, arg2আপনার প্রোগ্রামের যুক্তি।

4) ফলাফলটি মুছে ফেলার জন্য পরবর্তী কলগুলি malloc/ এর কাছে কলগুলির একটি তালিকা new

উদাহরণ স্বরূপ:

==4230==    at 0x1B977DD0: malloc (vg_replace_malloc.c:136)

==4230==    by 0x804990F: main (example.c:6)

আপনাকে বলবে কোন লাইনে malloc(যেটি মুক্তি পায়নি) ডাকা হয়েছিল।

অন্যদের দ্বারা নিযুক্ত হিসাবে, প্রতিটি new/ mallocকলের জন্য, আপনার পরবর্তী delete/ freeকল রয়েছে তা নিশ্চিত করুন।


6

আপনি যদি জিসিসি ব্যবহার করেন তবে জিপিওফ পাওয়া যায়।

আমি জানতে চেয়েছিলাম যে প্রোগ্রামার কীভাবে মেমরি ফাঁস করে

কিছু পিয়ার কোড পর্যালোচনার মাধ্যমেও সরঞ্জামগুলি ব্যবহার করে, কিছু আপনি যা করেন তা করে

প্রোগ্রামটিতে কোনও মেমরি ফাঁস নেই তা নিশ্চিত করার জন্য কোনও মানক বা পদ্ধতি অনুসরণ করা উচিত

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


কিছু সময় আমরা কনস্ট্রাক্টরে বরাদ্দ মুছতে পারি না that এই উপলক্ষে কী করা যায়।
ক্রিস_ভিআর

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

  2. এই ফোরামটি সি / সি ++ তে মেমরির ফুটো এড়াতে কয়েকটি উপায় নিয়ে আলোচনা করে ...


5

সংঘটনগুলির জন্য আপনার কোডটি অনুসন্ধান করুন newএবং নিশ্চিত করুন যে এগুলি সবই একজন কনস্ট্রাক্টরের সাথে কোনও ডেস্ট্রাক্টরের সাথে মিলে যাওয়া মুছা সহ ঘটে। নিশ্চিত হয়ে নিন যে এই নির্মাণকারীর মধ্যে কেবলমাত্র সম্ভাব্য নিক্ষেপ অপারেশন। এটি করার একটি সহজ উপায় হ'ল সমস্ত পয়েন্টারগুলিকে rapেকে রাখা std::auto_ptr, বা boost::scoped_ptr(আপনার শব্দার্থিক পদক্ষেপের প্রয়োজন হবে কি না তার উপর নির্ভর করে)। ভবিষ্যতের সমস্ত কোডের জন্য কেবল নিশ্চিত করে নিন যে প্রতিটি সংস্থান কোনও অবজেক্টের মালিকানাধীন যা তার ডেস্ট্রাক্টরে রিসোর্স পরিষ্কার করে। যদি আপনার সরু শব্দার্থবিজ্ঞানের প্রয়োজন হয় তবে আপনি এমন একটি সংকলকতে আপগ্রেড করতে পারবেন যা আর-মান উল্লেখগুলি সমর্থন করে (ভিএস 2010 আমি বিশ্বাস করি না) এবং মুভ কনস্ট্রাক্টর তৈরি করতে পারেন। আপনি যদি এটি না করতে চান তবে আপনি স্বতন্ত্রের বিবেকবান ব্যবহারের সাথে জড়িত বিভিন্ন কৌশল ব্যবহার করতে পারেন বা বুস্ট.মভ লাইব্রেরিটি ব্যবহার করে দেখতে পারেন।


কনস্ট্রাক্টরে বরাদ্দ থাকা মেমরিটি মুছে ফেলা সবসময় সম্ভব নয়
this

@ ক্রিস_ভিআর আপনার অর্থ কী? আপনার সমস্ত পয়েন্টার সদস্য যদি হয় scope_ptrএবং প্রতিটি স্বতন্ত্রভাবে আরম্ভ করা হয় তবে সফলভাবে তৈরি করা সমস্তগুলি তাদের পয়েন্টারগুলি মুছে ফেলবে, এবং অন্যরা এখনও যেভাবেই বরাদ্দ মেমরির পয়েন্টার ধারণ করবে না। আমি যখন কাজ থেকে বাড়ি ফিরে আসি তখন কয়েক ঘন্টার মধ্যে আমি উদাহরণ স্থাপন করব।
মনকারসে

@ ক্রিস_ভিআর: আপনার যদি সুনির্দিষ্ট উদাহরণ থাকে তবে এটি একটি নতুন প্রশ্ন হিসাবে পোস্ট করুন, তাই আমরা সেখানে এটি নিয়ে আলোচনা করতে পারি।
ডক ব্রাউন

5

মেমরি ফাঁস সনাক্ত করতে আপনি ভালগ্রাইন্ড সরঞ্জামটি ব্যবহার করতে পারেন।

এছাড়াও, একটি নির্দিষ্ট ফাংশনে ফাঁস খুঁজে পেতে, ফাংশনটির শেষে প্রস্থান (0) ব্যবহার করুন এবং তারপরে এটি Valgrind দিয়ে চালান

`$` valgrind ./your_CPP_program 

5

স্বয়ংক্রিয় মেমরি ফাঁস চেকারদের একটি সমীক্ষা

এই উত্তরে আমি বিভিন্ন মেমরি ফুটো চেকারকে মেমরি ফাঁস উদাহরণটি বোঝার জন্য সহজ একটি তুলনায় তুলনা করি।

যে কোনও কিছুর আগে, আসান উইকিতে এই বিশাল টেবিলটি দেখুন যা মানুষের জানা সমস্ত সরঞ্জামের সাথে তুলনা করে: https://github.com/google/sanitizers/wiki/AddressSanitizerCompistanceOfMemoryTools/d06210f759fec97066888e5f27c7e722832b0924

বিশ্লেষণ করা উদাহরণটি হ'ল:

main.c

#include <stdlib.h>

void * my_malloc(size_t n) {
    return malloc(n);
}

void leaky(size_t n, int do_leak) {
    void *p = my_malloc(n);
    if (!do_leak) {
        free(p);
    }
}

int main(void) {
    leaky(0x10, 0);
    leaky(0x10, 1);
    leaky(0x100, 0);
    leaky(0x100, 1);
    leaky(0x1000, 0);
    leaky(0x1000, 1);
}

গিটহাব উজানের দিকে

আমরা বিভিন্ন সরঞ্জাম কীভাবে স্পষ্টভাবে ফাঁসী কলগুলিকে নির্দেশ করে তা দেখার চেষ্টা করব।

গুগল দ্বারা gperftools থেকে tcmalloc

https://github.com/gperftools/gperftools

উবুন্টু 19.04 এ ব্যবহার:

sudo apt-get install google-perftools
gcc -ggdb3 -o main.out main.c -ltcmalloc
PPROF_PATH=/usr/bin/google-pprof \
  HEAPCHECK=normal \
  HEAPPROFILE=ble \
  ./main.out \
;
google-pprof main.out ble.0001.heap --text

প্রোগ্রাম রান আউটপুট মেমরি ফাঁস বিশ্লেষণ ধারণ করে:

WARNING: Perftools heap leak checker is active -- Performance may suffer
Starting tracking the heap
Dumping heap profile to ble.0001.heap (Exiting, 4 kB in use)
Have memory regions w/o callers: might report false leaks
Leak check _main_ detected leaks of 272 bytes in 2 objects
The 2 largest leaks:
Using local file ./main.out.
Leak of 256 bytes in 1 objects allocated from:
        @ 555bf6e5815d my_malloc
        @ 555bf6e5817a leaky
        @ 555bf6e581d3 main
        @ 7f71e88c9b6b __libc_start_main
        @ 555bf6e5808a _start
Leak of 16 bytes in 1 objects allocated from:
        @ 555bf6e5815d my_malloc
        @ 555bf6e5817a leaky
        @ 555bf6e581b5 main
        @ 7f71e88c9b6b __libc_start_main
        @ 555bf6e5808a _start


If the preceding stack traces are not enough to find the leaks, try running THIS shell command:

pprof ./main.out "/tmp/main.out.24744._main_-end.heap" --inuse_objects --lines --heapcheck  --edgefraction=1e-10 --nodefraction=1e-10 --gv

If you are still puzzled about why the leaks are there, try rerunning this program with HEAP_CHECK_TEST_POINTER_ALIGNMENT=1 and/or with HEAP_CHECK_MAX_POINTER_OFFSET=-1
If the leak report occurs in a small fraction of runs, try running with TCMALLOC_MAX_FREE_QUEUE_SIZE of few hundred MB or with TCMALLOC_RECLAIM_MEMORY=false, it might help find leaks more re
Exiting with error code (instead of crashing) because of whole-program memory leaks

এবং এর আউটপুটটিতে google-pprofহিপ ব্যবহার বিশ্লেষণ রয়েছে:

Using local file main.out.
Using local file ble.0001.heap.
Total: 0.0 MB
     0.0 100.0% 100.0%      0.0 100.0% my_malloc
     0.0   0.0% 100.0%      0.0 100.0% __libc_start_main
     0.0   0.0% 100.0%      0.0 100.0% _start
     0.0   0.0% 100.0%      0.0 100.0% leaky
     0.0   0.0% 100.0%      0.0 100.0% main

আউটপুট আমাদের তিনটি ফাঁসের দুটিতে নির্দেশ করে:

Leak of 256 bytes in 1 objects allocated from:
        @ 555bf6e5815d my_malloc
        @ 555bf6e5817a leaky
        @ 555bf6e581d3 main
        @ 7f71e88c9b6b __libc_start_main
        @ 555bf6e5808a _start
Leak of 16 bytes in 1 objects allocated from:
        @ 555bf6e5815d my_malloc
        @ 555bf6e5817a leaky
        @ 555bf6e581b5 main
        @ 7f71e88c9b6b __libc_start_main
        @ 555bf6e5808a _start

আমি নিশ্চিত না যে তৃতীয়টি কেন প্রদর্শিত হয়নি

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

আউটপুট নিজেই উল্লিখিত হিসাবে, এটি একটি কার্যকর সম্পাদন মন্দা জড়িত।

আরও নথি এখানে:

আরও দেখুন: টিসিমালোকে কীভাবে ব্যবহার করবেন?

উবুন্টু 19.04 এ পরীক্ষিত, গুগল-পারফিউলস 2.5-2।

গুগল দ্বারা ঠিকানা স্যানিটাইজার (আসান) by

https://github.com/google/sanitizers

পূর্বে উল্লিখিত: একটি সি ++ কোড / প্রকল্পে মেমরি ফাঁস কীভাবে পাওয়া যায়? TODO বনাম tcmalloc।

এটি ইতিমধ্যে জিসিসিতে সংহত হয়েছে, সুতরাং আপনি কেবল এটি করতে পারেন:

gcc -fsanitize=address -ggdb3 -o main.out main.c
./main.out 

এবং এক্সিকিউশন আউটপুট:

=================================================================
==27223==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 4096 byte(s) in 1 object(s) allocated from:
    #0 0x7fabbefc5448 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10c448)
    #1 0x55bf86c5f17c in my_malloc /home/ciro/test/main.c:4
    #2 0x55bf86c5f199 in leaky /home/ciro/test/main.c:8
    #3 0x55bf86c5f210 in main /home/ciro/test/main.c:20
    #4 0x7fabbecf4b6a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x26b6a)

Direct leak of 256 byte(s) in 1 object(s) allocated from:
    #0 0x7fabbefc5448 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10c448)
    #1 0x55bf86c5f17c in my_malloc /home/ciro/test/main.c:4
    #2 0x55bf86c5f199 in leaky /home/ciro/test/main.c:8
    #3 0x55bf86c5f1f2 in main /home/ciro/test/main.c:18
    #4 0x7fabbecf4b6a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x26b6a)

Direct leak of 16 byte(s) in 1 object(s) allocated from:
    #0 0x7fabbefc5448 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10c448)
    #1 0x55bf86c5f17c in my_malloc /home/ciro/test/main.c:4
    #2 0x55bf86c5f199 in leaky /home/ciro/test/main.c:8
    #3 0x55bf86c5f1d4 in main /home/ciro/test/main.c:16
    #4 0x7fabbecf4b6a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x26b6a)

SUMMARY: AddressSanitizer: 4368 byte(s) leaked in 3 allocation(s).

যা স্পষ্টভাবে সমস্ত ফাঁস চিহ্নিত করে। নিস!

আসান অন্যান্য শীতল চেকগুলিও করতে পারে যেমন সীমানার বাইরে লেখেন: স্ট্যাক স্ম্যামিং সনাক্ত হয়েছে

উবুন্টু 19.04, জিসিসি 8.3.0 এ পরীক্ষিত।

Valgrind- র

http://www.valgrind.org/

পূর্বে উল্লিখিত ছিল: https://stackoverflow.com/a/37661630/895245

ব্যবহার:

sudo apt-get install valgrind
gcc -ggdb3 -o main.out main.c
valgrind --leak-check=yes ./main.out

আউটপুট:

==32178== Memcheck, a memory error detector
==32178== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==32178== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==32178== Command: ./main.out
==32178== 
==32178== 
==32178== HEAP SUMMARY:
==32178==     in use at exit: 4,368 bytes in 3 blocks
==32178==   total heap usage: 6 allocs, 3 frees, 8,736 bytes allocated
==32178== 
==32178== 16 bytes in 1 blocks are definitely lost in loss record 1 of 3
==32178==    at 0x483874F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==32178==    by 0x10915C: my_malloc (main.c:4)
==32178==    by 0x109179: leaky (main.c:8)
==32178==    by 0x1091B4: main (main.c:16)
==32178== 
==32178== 256 bytes in 1 blocks are definitely lost in loss record 2 of 3
==32178==    at 0x483874F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==32178==    by 0x10915C: my_malloc (main.c:4)
==32178==    by 0x109179: leaky (main.c:8)
==32178==    by 0x1091D2: main (main.c:18)
==32178== 
==32178== 4,096 bytes in 1 blocks are definitely lost in loss record 3 of 3
==32178==    at 0x483874F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==32178==    by 0x10915C: my_malloc (main.c:4)
==32178==    by 0x109179: leaky (main.c:8)
==32178==    by 0x1091F0: main (main.c:20)
==32178== 
==32178== LEAK SUMMARY:
==32178==    definitely lost: 4,368 bytes in 3 blocks
==32178==    indirectly lost: 0 bytes in 0 blocks
==32178==      possibly lost: 0 bytes in 0 blocks
==32178==    still reachable: 0 bytes in 0 blocks
==32178==         suppressed: 0 bytes in 0 blocks
==32178== 
==32178== For counts of detected and suppressed errors, rerun with: -v
==32178== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)

সুতরাং আবারও, সমস্ত ফাঁস সনাক্ত করা হয়েছিল।

আরও দেখুন: আমি কীভাবে মেমরি ফাঁস খুঁজে পেতে ভালগ্রাইন্ড ব্যবহার করব?

উবুন্টু 19.04, ভ্যালগ্রাইন্ড 3.14.0 এ পরীক্ষিত।


4

ভিজ্যুয়াল লিক ডিটেক্টর (ভিএলডি) ভিজ্যুয়াল সি ++ এর জন্য একটি ফ্রি, মজবুত, ওপেন সোর্স মেমরি লিক সনাক্তকরণ সিস্টেম।

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

আপনার যদি কেবল ক্র্যাশ ডাম্প থাকে তবে আপনি উইন্ডবিজি !heap -lকমান্ডটি ব্যবহার করতে পারেন এটি ফাঁস হিপ ব্লকগুলি সনাক্ত করবে। Gflags বিকল্পটি আরও ভাল খুলুন: "ব্যবহারকারী মোড স্ট্যাক ট্রেস ডাটাবেস তৈরি করুন", তারপরে আপনি মেমরি বরাদ্দ কল স্ট্যাক দেখতে পাবেন।


4

এমটিউনার একটি ফ্রি মাল্টি প্ল্যাটফর্ম মেমরি প্রোফাইলিং, ফাঁস সনাক্তকরণ এবং বিশ্লেষণ সরঞ্জাম যা এমএসভিসি, জিসিসি এবং ক্ল্যাং সংকলক সমর্থন করে। বৈশিষ্ট্য অন্তর্ভুক্ত:

  • মেমরি ব্যবহার এবং লাইভ মেমরি ব্লকগুলির টাইমলাইন ভিত্তিক ইতিহাস
  • হিপ, মেমরি ট্যাগ, সময়সীমা ইত্যাদির উপর ভিত্তি করে শক্তিশালী মেমরি অপারেশন ফিল্টারিং
  • পূর্ণ উত্স কোড সহ ম্যানুয়াল উপকরণের জন্য এসডিকে
  • কমান্ড লাইন ব্যবহারের মাধ্যমে ক্রমাগত সংহতকরণ সমর্থন support
  • কল স্ট্যাক ট্রি এবং ট্রি ম্যাপ নেভিগেশন
  • অনেক বেশি.

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


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি একটি দুর্দান্ত সরঞ্জাম এবং বরাদ্দগুলি / ডিওলোকেশনগুলির পরিমাণগুলি অন্যরা পারে না তা পরিচালনা করতে পারে।
সার্জ রোগাচ

3

উইন্ডোজে আপনি সিআরটি ডিবাগ হিপ ব্যবহার করতে পারেন ।

প্রোগ্রামটিতে কোনও মেমরি ফাঁস নেই তা নিশ্চিত করার জন্য কোনও মানক বা পদ্ধতি অনুসরণ করা উচিত।

হ্যাঁ, ম্যানুয়াল মেমরি পরিচালনা ব্যবহার করবেন না (যদি আপনি কখনও কল করেন deleteবা delete[]ম্যানুয়ালি, তবে আপনি এটি ভুল করছেন)। RAII এবং স্মার্ট পয়েন্টারগুলি ব্যবহার করুন, হ্যাপ বরাদ্দকে সর্বনিম্ন সর্বনিম্নে সীমাবদ্ধ করুন (বেশিরভাগ সময় স্বয়ংক্রিয় চলকগুলি যথেষ্ট হবে) ice


3

আপনার প্রশ্নের দ্বিতীয় অংশের উত্তর দেওয়া,

প্রোগ্রামটিতে কোনও মেমরি ফাঁস নেই তা নিশ্চিত করার জন্য কোনও মানক বা পদ্ধতি অনুসরণ করা উচিত।

হ্যা এখানে. এবং এটি সি এবং সি ++ এর মধ্যে অন্যতম মূল পার্থক্য।

সি ++ এ, আপনাকে কখনও কল করা উচিত নয় newবা deleteআপনার ব্যবহারকারীর কোডে। RAII হ'ল একটি খুব সাধারণভাবে ব্যবহৃত কৌশল, যা সম্পদ পরিচালনার সমস্যাটি বেশ সমাধান করে। আপনার প্রোগ্রামের প্রতিটি সংস্থান (একটি উত্স এমন কিছু যা অর্জন করতে হবে এবং তারপরে পরে প্রকাশিত হবে: ফাইল হ্যান্ডলগুলি, নেটওয়ার্ক সকেটগুলি, ডাটাবেস সংযোগগুলি, তবে সাধারণ মেমরির বরাদ্দও রয়েছে এবং কিছু ক্ষেত্রে, API কলগুলির জোড়া (বিগনিএক্স ( ) / এন্ডএক্স (), লকওয়াই (), আনলকওয়াই ()), একটি শ্রেণিতে আবৃত করা উচিত, যেখানে:

  • কনস্ট্রাক্টর রিসোর্সটি অর্জন করে (কল করেnew রিসোর্সটি যদি রিসোর্সটি স্মরণ বরাদ্দ হয় তবে করে)
  • ডেস্ট্রাক্টর রিসোর্সটি প্রকাশ করে,
  • কপি করা এবং অ্যাসাইনমেন্ট হয় বাধা দেওয়া হয় (অনুলিপি কন্সট্রাক্টর এবং অ্যাসাইনমেন্ট অপারেটরগুলিকে ব্যক্তিগত করে), বা সঠিকভাবে কাজ করতে প্রয়োগ করা হয় (উদাহরণস্বরূপ অন্তর্নিহিত সংস্থানকে ক্লোন করে)

এই ক্লাসটি স্থানীয়ভাবে, স্ট্যাকের উপর, বা শ্রেণীর সদস্য হিসাবে, এবং কল করে নয় instnew কোনও পয়েন্টার এবং সঞ্চয় ।

আপনার প্রায়ই এই ক্লাসগুলি নিজেরাই সংজ্ঞায়িত করার প্রয়োজন হয় না। স্ট্যান্ডার্ড লাইব্রেরি পাত্রে পাশাপাশি এইরকম আচরণ করা হয়, যাতে std::vectorভেক্টরটি নষ্ট হয়ে গেলে যে কোনও বস্তু সঞ্চিত থাকে সেগুলি মুক্ত হয়। সুতরাং আবার, পাত্রে কোনও পয়েন্টার সঞ্চয় করবেন না (যার জন্য আপনাকে কল করতে newএবং প্রয়োজন হবে delete), বরং এটি অবজেক্টটি নিজেই (যা আপনাকে নিখরচায় মেমরি পরিচালনা দেয় )। তেমনি, স্মার্ট পয়েন্টার ক্লাসগুলি সহজেই বরাদ্দ করতে হবে এমন অবজেক্টগুলিকে সহজেই মোড়তে newএবং তাদের জীবনকাল নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে ।

এর অর্থ হ'ল যখন বস্তুটি সুযোগের বাইরে চলে যায় তখন এটি স্বয়ংক্রিয়ভাবে ধ্বংস হয়ে যায় এবং এর উত্সটি প্রকাশিত ও পরিষ্কার হয়ে যায়।

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


যদি স্মার্ট পয়েন্টারটি একটি শ্রেণি ধারণ করে এবং সেই শ্রেণিতে অন্য কয়েকটি শ্রেণির পয়েন্টার থাকে। স্মার্ট বন্ধ হয়ে যাওয়ার অর্থ এই নয় যে এর ভিতরে থাকা সমস্ত পয়েন্টার নিরাপদে মুছে যাবে।
ক্রিস_ভির

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

3

অ্যাড্রেস স্যানিটাইজার (আসান) একটি দ্রুত মেমরি ত্রুটি সনাক্তকারী। এটি সি / সি ++ প্রোগ্রামগুলিতে ব্যবহারের পরে-মুক্ত এবং {হিপ, স্ট্যাক, গ্লোবাল}-বাফার ওভারফ্লো বাগগুলি সন্ধান করে। এটি পাওয়া যায়:

  • বিনামূল্যে পরে ব্যবহার করুন (ঝুঁকির পয়েন্টার ডিরিফারেন্স)
  • গাদা বাফার ওভারফ্লো
  • স্ট্যাক বাফার ওভারফ্লো
  • গ্লোবাল বাফার ওভারফ্লো
  • ফিরে আসার পরে ব্যবহার করুন
  • প্রারম্ভিক ক্রম বাগ

এই সরঞ্জামটি খুব দ্রুত। চালিত প্রোগ্রামটির গড় মন্দা ~ 2x।



0

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


-1

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


-3

অ্যাপ্লিকেশন কোডে কোনও "নতুন" বা "মুছুন" ব্যবহার করা উচিত নয়। পরিবর্তে, একটি নতুন প্রকার তৈরি করুন যা ম্যানেজার / ওয়ার্কার আইডিয়ামটি ব্যবহার করে, যাতে ম্যানেজার শ্রেণি মেমরি বরাদ্দ করে এবং মুক্ত করে এবং অন্যান্য সমস্ত ক্রিয়াকলাপকে কর্মী অবজেক্টে ফরোয়ার্ড করে।

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

তবে এটি প্রচেষ্টাটির পক্ষে মূল্যবান কারণ আপনার তখন কখনই মেমরি ফাঁসের বিষয়ে চিন্তা করতে হবে না, যার অর্থ আপনার এমনকি তাদের সন্ধান করতে হবে না।

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