روش صحیح مدیریت حافظه در ++C - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

روش صحیح مدیریت حافظه در ++C

+4 امتیاز
من می خواستم بدونم که صحیح ترین روش برای مدیریت منابع و حافظه در ++C یا C++11 چیه ؟‌‌ آیا صرفا استفاده از delete هر جا که new کردیم کافیه ؟
سوال شده شهریور 5, 1393  بوسیله ی Xavi (امتیاز 627)   24 83 110

2 پاسخ

+3 امتیاز

صحیح ترین راهی وجود نداره . توی ++C انتخاب هایی زیادی وجود داره دلیلش اینکه شرایط زیادی هم وجود داره .

برای همین شما نسبت به شرایط تصمیم میگیرید که چطوری از حافظه استفاده کنید .

اگ براتون  Memory Fragmentation از سرعت مهمتره از Memory Allocatorی استفاده میکنید که هدف اصلیش Defragmentation باشه و خوب سرعت برنامه تون هم میاد پایین .

توی شرایطی بخاطر سرعت نیاز دارید که از یک Memory Pool استفاده کنید  و حافظه رو فدای سرعت میکنید .

و بازم افراطی ترش اینه که هر شی Memory Pool رو با اندازه ی Cache Line تراز (Align) میکنید که حتی بازم حافظه بیشتری رو فدای سرعت میکنید .

یا توی شرایط دیگه ای از Stack Allocator استفاده کنید .

new و delete یا malloc و free بصورت عادی مشکلی ندارن . و یه حالت تعادل دارن . شما نسبت به برنامه ای که مینویسید نیازتون تغییر میکنه . البته همیشه میتونید از همین new و delete استفاده کنید ولی توی شرایط های خاص خیلی بهتره که روش های دیگه هم استفاده کنید.

 

پاسخ داده شده شهریور 5, 1393 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
+1 امتیاز

البته علاوه بر سرعت leakage و نشتی نداشتن هم خیلی مهمه (هم از نظر performane و هم از نظر security )

 

برای leakage نداشتن میشه چند تا کار کرد  :

 

1_ سعی کنید تا اونجایی که میشه از اشاره گر استفاده نکنین و متغیر ها رو بصورت معمولی بسازید (سریع تر هم هست )
2_برای ذخیره چند متغیر بجای گرفتن حافظه با new یا ساختن link list , ... از کلاس هایی مثل ,array,string,vector,list , ... استفاده کنین .
3_اگر به هر دلیلی نیاز به استفاده از new داشتید از smart pointer ها مثل unique pointer ,shared pointer استفاده کنید .
4_. برای پیدا کردن leak از ابزارهایی مثل valgrind یا LeakSanitizer استفاده کنید(البته اگر موارد بالا رو رعایت کنید احتمالا هیچ وقت نشت ندارید ولی ممکنه هنوز قسمت هایی از برنامه مموری رو خراب کرده باشن مثلا نوشتن در محدوده خارج از اندازه وکتور و چیزای دیگه ... که این جور موارد با اون ۲ تا قابل شناسایی هستن)
 
ضمنا leak فقط مربوط به حافظه نمیشه چیزای دیگه مثلا Handle فایل یا mutex ای که thread رو باهاش lock کردید هم ممکنه leakage داشته باشن .
 

 

پاسخ داده شده شهریور 6, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده شهریور 6, 1393 بوسیله ی BlueBlade
...