PDA

View Full Version : مدریت حافظه



Nariman619
چهارشنبه 29 مرداد 1393, 16:47 عصر
سلام
من دانشجوی ترم دوم نرم افزارم و در حال یادگیری اصولی ++C هستم.خیلی ها گفتن که سمت #C برو اما من کلا به این زبان علاقه ای ندارم و همیشه دنبال زبان های Open Source هستم و دشواری زبان هم برام اهمیتی نداره.الان تو یادگیری ++C به استفاده از حافظه پویا به مشکل برخورد کردم که اگه درست استفاده نشه باعث نشت حافظه و موارد دیگه می شه...
کلا فهمیدم که سختی ++C فقط به خاطر پیچیدگی اون موقع کار با حافظه هست.چون زبانی مثل JAVA و یا PHP ( برای وب ) هیچ کدوم از این دردسر ها رو ندارن !
من الان سوالم اینه که چطور حافظه ها رو به درستی بگیرم و آزاد کنم ؟ چطور برنامه ای که می نویسم نشت حافظه نداشته باشه.کلا چطور حافظه رو درست مدریت کنم تو ++C
اگه منبعی هم در این مورد دارین که عالی میشه...
ممنون.

motherboard
چهارشنبه 29 مرداد 1393, 17:21 عصر
سلام
من دانشجوی ترم دوم نرم افزارم و در حال یادگیری اصولی ++C هستم.خیلی ها گفتن که سمت #C برو اما من کلا به این زبان علاقه ای ندارم و همیشه دنبال زبان های Open Source هستم و دشواری زبان هم برام اهمیتی نداره.الان تو یادگیری ++C به استفاده از حافظه پویا به مشکل برخورد کردم که اگه درست استفاده نشه باعث نشت حافظه و موارد دیگه می شه...
کلا فهمیدم که سختی ++C فقط به خاطر پیچیدگی اون موقع کار با حافظه هست.چون زبانی مثل JAVA و یا PHP ( برای وب ) هیچ کدوم از این دردسر ها رو ندارن !
من الان سوالم اینه که چطور حافظه ها رو به درستی بگیرم و آزاد کنم ؟ چطور برنامه ای که می نویسم نشت حافظه نداشته باشه.کلا چطور حافظه رو درست مدریت کنم تو ++C
اگه منبعی هم در این مورد دارین که عالی میشه...
ممنون.
عرضم به خدمتت که من هم در حال یادگیری c++ هستم.اما اصول برنامه نویسی میگه که از هر کدوم از امکانات c++ باید در جای خودش استفاده کرد.حالا هر امکاناتی می خواد باشه.ضمن اینکه خلاقیت هم باید چاشنی کار بشه.چیز دیگه ای ندارم که بگم.

omid_kma
چهارشنبه 29 مرداد 1393, 17:33 عصر
البته leak فقط مربوط به حافظه نمیشه چیزای دیگه مثلا Handle فایل یا mutex ای که thread رو باهاش lock کردید هم ممکنه نشتی یا leakage داشته باشن .
جند تا کار میشه کرد
1_ سعی کنین تا اونجایی که میشه از اشاره گر استفاده نکنین و متغیر ها رو بصورت معمولی بسازید .
2_برای ذخیره چند متغیر بجای گرفتن حافظه با new یا ساختن link list , ... از کلاس هایی مثل ,array,string,vector,list , ... استفاده کنین .
3_اگر به هر دلیلی نیاز به استفاده از new داشتید (یا چیزای دیگه مثلا ذخیره mutex ) از smart pointer (http://www.7khatcode.com/299/smart-pointer-%DB%8C%D8%A7-%D8%A7%D8%B4%D8%A7%D8%B1%D9%87-%DA%AF%D8%B1-%D9%87%D9%88%D8%B4%D9%85%D9%86%D8%AF?show=299#q299 ) ها مثل unique pointer ,shared pointer استفاده کنید .
4_ اگر موارد بالا رو رعایت کنید احتمالا هیچ وقت نشت ندارید ولی ممکنه هنوز قسمت هایی از برنامه مموری رو خراب کرده باشن مثلا نوشتن در محدوده خارج از اندازه وکتور و چیزای دیگه .. برای پیدا کردن این خرابی ها میشه از ابزارهایی مثل valgrind (http://valgrind.org/) یا LeakSanitizer (http://clang.llvm.org/docs/LeakSanitizer.html) استفاده کرد .

motherboard
چهارشنبه 29 مرداد 1393, 17:37 عصر
1_ سعی کنین تا اونجایی که میشه از اشاره گر استفاده نکنین و متغیر ها رو بصورت معمولی بسازید .
چرا؟ لطفا با دلیل ذکر کنید.

omid_kma
چهارشنبه 29 مرداد 1393, 17:39 عصر
چون اگر new یا new[] استفاده بشه باید بعدش حتما delete یا delete[] استفاده بشه که خب ممکنه خیلی وقت ها فراموش بشه خیلی وقت ها هم به این سادگی نیست مثلا ممکنه یک تابع exception برگردونه یا سریع تر از پایان return بشه .

motherboard
چهارشنبه 29 مرداد 1393, 17:50 عصر
چیزای دیگه مثلا Handle فایل یا mutex ای که thread رو باهاش lock کردید هم ممکنه نشتی یا leakage داشته باشن .
بی زحمت در مورد این نقل قولتون هم یک شرحی می دهید؟منظورم اینه که ساده تر شرح بدید.منظورتون چی بود دقیقا؟

ProgramYL
چهارشنبه 29 مرداد 1393, 17:53 عصر
سلام من دانشجوی ترم دوم نرم افزارم و در حال یادگیری اصولی ++C هستم.خیلی ها گفتن که سمت #C برو اما من کلا به این زبان علاقه ای ندارم و همیشه دنبال زبان های Open Source هستم .. به نظرم اصطلاح Open Source فقط میتونه برای برنامه های نوشته شده به کار بره نه برای زبان های برنامه نویسی؛ چون هر زبانی باید استاندارد سازی بشه و با تغییر در انجمن ها به نسخه جدید ارتقا پیدا نمیکنه.

motherboard
چهارشنبه 29 مرداد 1393, 18:03 عصر
به نظرم اصطلاح Open Source فقط میتونه برای برنامه های نوشته شده به کار بره نه برای زبان های برنامه نویسی؛ چون هر زبانی باید استاندارد سازی بشه و با تغییر در انجمن ها به نسخه جدید ارتقا پیدا نمیکنه.
پلتفرم رو می دونم چیه.اما فرقش با اوپن سورس چیه؟

omid_kma
چهارشنبه 29 مرداد 1393, 18:26 عصر
بی زحمت در مورد این نقل قولتون هم یک شرحی می دهید؟منظورم اینه که ساده تر شرح بدید.منظورتون چی بود دقیقا؟
ببینید مثلا در مورد mutex
شما وقتی که یک برنامه رو بصورت موازی مینویسید 2 یا چند تا thread یا نخ میسازید که بصورت همزمان روی core های متفاوت cpu اجرا میشن(البته روی یک هسته هم میتونن اجرا بشن ) حالا این 2 تا thread ممکنه یکیشون قرار باشه مثلا داخل یک آرایه بنویسه و یکی دیگه قرار باشه همزمان از آرایه اطلاعات رو بخونه این جا اتفاقی که پیش میاد اینه که ممکنه وسط نوشتن داخل آرایه اطلاعات خونده بشه که باعث میشه اطلاعاتی که خونده میشن درست نباشن ( البته این مثال ساده بود خیلی وقت ها اجتمال این که کل داده ای که داریدخراب بشه هم هست)
حالا یکی از راه هایی که میشه از این اتفاق جلوگیری کرد mutex هست (راه های بهتری مثل barrier و ... هم وجود داره )
mutex داخل STL به این شکل هست که یک شی از کلاس std::mutex داخل thread میسازید

std::mutex m ;

حالا هر جا که مثلا نیاز بود داخل آرایه ای که توی 2 تا thread اسفاده میشه بنویسین باید قبل از نوشتن m.lock بزارید و وقتی که کارتون تموم شد m.unlock حالا اگر این m.unlock یادتون بره (مثل delete ) باعث میشه thread دیگه کار نکنه و هنگ کنه . این جا برای این که خودکار unlock انجام بشه شیmutex گذاشته میشه داخل std::lock_gaurd حالا هروقت که شی از scope خارج بشه بصورت خودکار unlock میشه .
اطلاعات بیشتر رو میتونید با مطالعه در مورد multithreading کسب کنید (فکر کنم کاملا از موضوع این تاپیک منجرف شدیم :) )

ProgramYL
چهارشنبه 29 مرداد 1393, 18:40 عصر
پلتفرم رو می دونم چیه.اما فرقش با اوپن سورس چیه؟

پلتفرم میتونه اپن سورس باشه، یعنی کد تغییر اون در اختیار عموم قرار داده بشه (درصورتیکه اشاره به نرم افزار باشه)، میشه یک پلتفرم کد باز نرم افزاری؛ و همچنین یک پلتفرم میتونه سخت افزاری و کد باز باشه، یعنی چگونگی طراحی سخت افزار در اختیار عموم قرار داده میشه، که میشه یک پلتفرم سخت افزاری کد باز.

ciavosh
جمعه 31 مرداد 1393, 08:37 صبح
به نظرم اصطلاح Open Source فقط میتونه برای برنامه های نوشته شده به کار بره نه برای زبان های برنامه نویسی؛ چون هر زبانی باید استاندارد سازی بشه و با تغییر در انجمن ها به نسخه جدید ارتقا پیدا نمیکنه.
شاید منظور Runtime و کامپایلر باشه.

ProgramYL
جمعه 31 مرداد 1393, 09:04 صبح
شاید منظور Runtime و کامپایلر باشه.

بله، runtime و کامپایلرها معمولا open source هستند (علاوه بر کامپایلر #C) و اگر به زبان برنامه نویسی اشاره بشه منظور کامپایلر زبان هست. 1 (http://en.wikipedia.org/wiki/Open-source_movement) 2 (http://en.wikipedia.org/wiki/List_of_open-source_programming_languages)
حالا که جستجو کردم، دیدم زبان Go اوپن سورس شده و کدش در اختیار توسعه دهندگان قرار گرفته، البته مطمئن نیستم.

پ.ن: البته میدونیم که اوپن سورس بودن به معنای ارائه تمام کد نیست.

motherboard
جمعه 31 مرداد 1393, 10:00 صبح
بله، runtime و کامپایلرها معمولا open source هستند (علاوه بر کامپایلر #C) و اگر به زبان برنامه نویسی اشاره بشه منظور کامپایلر زبان هست. 1 (http://en.wikipedia.org/wiki/Open-source_movement) 2 (http://en.wikipedia.org/wiki/List_of_open-source_programming_languages)

حالا که جستجو کردم، دیدم زبان Go اوپن سورس شده و کدش در اختیار توسعه دهندگان قرار گرفته، البته مطمئن نیستم.
یعنی الان همین کامپایلری که در ++c استفاده می کنیم به صورت اوپن سورس در اینترنت موجود است؟:متعجب:یعنی الان میشه کامپایلر رو ویرایش کرد؟:متعجب:

ciavosh
جمعه 31 مرداد 1393, 10:30 صبح
یعنی الان همین کامپایلری که در ++c استفاده می کنیم به صورت اوپن سورس در اینترنت موجود است؟:متعجب:یعنی الان میشه کامپایلر رو ویرایش کرد؟:متعجب:
بله این امکان هست. به اصطلاح میگن شما میتونی اگر بتونی:چشمک: