SlideShare a Scribd company logo
1 of 9
Resource Management
Smart Pointers
unique_ptr
shared_ptr
‫بر‬ ‫بیشتر‬ ‫در‬ ‫مردم‬ ‫بیشتر‬ ‫برای‬ ‫که‬ ‫هایی‬ ‫مولفه‬ ‫کردن‬ ‫فراهم‬‫ها‬ ‫نامه‬
‫دارند‬ ‫کاربرد‬
‫محاسبات‬ ‫مانند‬ ‫تر‬ ‫رایج‬ ‫غیر‬ ‫کاربردهای‬ ‫از‬ ‫تعدادی‬ ‫کردن‬ ‫فراهم‬
‫و‬ ‫ها‬ ‫رشته‬ ‫با‬ ‫کار‬ ‫و‬ ‫ریاضی‬ ‫و‬ ‫عددی‬text‫ها‬
 Resource
 Leak
 Constructor /Destructor
01. mutex m; // used to protect access to shared data
02. // ...
03. void f()
04. {
05. unique_lock<mutex> lck {m}; // acquire the mutex m
06. // ... manipulate shared data ...
07. }
01. void f(int i, int j) // X* vs. unique_ptr<X>
02. {
03. X* p = new X; // allocate a new X
04. // allocate a new X and give its pointer to unique_ptr
05. unique_ptr<X> sp {new X};
06. // ...
07. if (i<99) throw Z{}; // may throw an exception
08. if (j<77) return; // may return "early"
09. p–>do_something(); // may throw an exception
10. sp–>do_something(); // may throw an exception
11. // ...
12. delete p; // destroy *p
13. }
01. void f(int i, int j) // use a local variable
02. {
03. X x;
04. // ...
05. }
01. void f(shared_ptr<fstream>);
02. void g(shared_ptr<fstream>);
03.
04. void user(const string& name, ios_base::openmode mode)
05. {
06. shared_ptr<fstream> fp {new fstream(name,mode)};
07. // make sure the file was properly opened
08. if (!*fp) throw No_file{};
09. f(fp);
10. g(fp);
11. // ...
12. }
‫یه‬ ‫که‬ ‫زمانی‬Object‫گذاریم‬ ‫می‬ ‫اشتراک‬ ‫به‬ ‫رو‬
‫به‬Object‫های‬Polymorphic‫داریم‬ ‫نیاز‬
‫گذاری‬ ‫اشتراک‬ ‫به‬Object‫های‬Polymorphic
16. smart pointers

More Related Content

More from Vahid Heidari

9. class hierarchies
9. class hierarchies9. class hierarchies
9. class hierarchiesVahid Heidari
 
7. abstraction mechanisms, containers
7. abstraction mechanisms, containers7. abstraction mechanisms, containers
7. abstraction mechanisms, containersVahid Heidari
 
6. separation, namespace, error
6. separation, namespace, error6. separation, namespace, error
6. separation, namespace, errorVahid Heidari
 
5. struct, class, enum
5. struct, class, enum5. struct, class, enum
5. struct, class, enumVahid Heidari
 
2. types, vars, arith, consts
2. types, vars, arith, consts2. types, vars, arith, consts
2. types, vars, arith, constsVahid Heidari
 
1. preface, hello world
1. preface, hello world1. preface, hello world
1. preface, hello worldVahid Heidari
 

More from Vahid Heidari (9)

9. class hierarchies
9. class hierarchies9. class hierarchies
9. class hierarchies
 
8. abstract types
8. abstract types8. abstract types
8. abstract types
 
7. abstraction mechanisms, containers
7. abstraction mechanisms, containers7. abstraction mechanisms, containers
7. abstraction mechanisms, containers
 
6. separation, namespace, error
6. separation, namespace, error6. separation, namespace, error
6. separation, namespace, error
 
5. struct, class, enum
5. struct, class, enum5. struct, class, enum
5. struct, class, enum
 
4. pointers, arrays
4. pointers, arrays4. pointers, arrays
4. pointers, arrays
 
3. tests, loops
3. tests, loops3. tests, loops
3. tests, loops
 
2. types, vars, arith, consts
2. types, vars, arith, consts2. types, vars, arith, consts
2. types, vars, arith, consts
 
1. preface, hello world
1. preface, hello world1. preface, hello world
1. preface, hello world
 

16. smart pointers

  • 1.
  • 3. ‫بر‬ ‫بیشتر‬ ‫در‬ ‫مردم‬ ‫بیشتر‬ ‫برای‬ ‫که‬ ‫هایی‬ ‫مولفه‬ ‫کردن‬ ‫فراهم‬‫ها‬ ‫نامه‬ ‫دارند‬ ‫کاربرد‬ ‫محاسبات‬ ‫مانند‬ ‫تر‬ ‫رایج‬ ‫غیر‬ ‫کاربردهای‬ ‫از‬ ‫تعدادی‬ ‫کردن‬ ‫فراهم‬ ‫و‬ ‫ها‬ ‫رشته‬ ‫با‬ ‫کار‬ ‫و‬ ‫ریاضی‬ ‫و‬ ‫عددی‬text‫ها‬
  • 4.  Resource  Leak  Constructor /Destructor
  • 5. 01. mutex m; // used to protect access to shared data 02. // ... 03. void f() 04. { 05. unique_lock<mutex> lck {m}; // acquire the mutex m 06. // ... manipulate shared data ... 07. }
  • 6. 01. void f(int i, int j) // X* vs. unique_ptr<X> 02. { 03. X* p = new X; // allocate a new X 04. // allocate a new X and give its pointer to unique_ptr 05. unique_ptr<X> sp {new X}; 06. // ... 07. if (i<99) throw Z{}; // may throw an exception 08. if (j<77) return; // may return "early" 09. p–>do_something(); // may throw an exception 10. sp–>do_something(); // may throw an exception 11. // ... 12. delete p; // destroy *p 13. } 01. void f(int i, int j) // use a local variable 02. { 03. X x; 04. // ... 05. }
  • 7. 01. void f(shared_ptr<fstream>); 02. void g(shared_ptr<fstream>); 03. 04. void user(const string& name, ios_base::openmode mode) 05. { 06. shared_ptr<fstream> fp {new fstream(name,mode)}; 07. // make sure the file was properly opened 08. if (!*fp) throw No_file{}; 09. f(fp); 10. g(fp); 11. // ... 12. }
  • 8. ‫یه‬ ‫که‬ ‫زمانی‬Object‫گذاریم‬ ‫می‬ ‫اشتراک‬ ‫به‬ ‫رو‬ ‫به‬Object‫های‬Polymorphic‫داریم‬ ‫نیاز‬ ‫گذاری‬ ‫اشتراک‬ ‫به‬Object‫های‬Polymorphic

Editor's Notes

  1. ما در این ویدیو وارد فصل 5 کتاب شدیم. توی فصل پنجم در مورد مدیریت منابع با smart pointerها و مفاهیم Concurency و امکانات اون در سی پلاس پلاس و در آخر هم در مورد utilityها بحث می کنیم. توی این ویدیو با مدیریت منابع و smart pointer ها آشنا می شیم.
  2. ما توی ویدیوی 12 در مورد استاندارد هایی که خود کتابخونه استاندارد باید رعایت بکنه صحبت کردیم و توی این ویدیو در مورد اهداف کتابخونه استاندارد صحبت می کنیم. از دید کاربرهای یه زبان، کتابخونه ای ایده آله که تمامی نیازهای اساسی اونو در قالب componentهایی در خودش داشته باشه. از دید کاربردی هم خیلی از کتابخونه های تجاری به این ایده آل برنامه نویسا نزدیک شدن. اما از دید کتابخونه استاندارد این هدفی نست که بخواد بهش پایبند باشه و همه چیزایی که همه بهش احتیاج دارن رو بذاره توی کتابخونه استاندارد. هدف کتابخونه استاندارد اینه که componentهایی که برای همه مردم مفید هستند و بیشترین کاربرد رو دارند فراهم کنه. در نتیجه نیازهایی که بیشترین اشتراک رو بین application های مختلف دارند رو برای ما فراهم می کنه. همینطور توابع محاسباتی و کار با رشته ها رو برای ما به نحو خوب و قابل قبولی فراهم کرده.
  3. یکی از اساسی ترین نیاز های یه برنامه اینه که منابع خودش رو مدیریت کنه. منابع به هر چیزی که باید فرایند تخصیص پیدا کردن و بعد آزاد کردن روش انجام بشه گفته میشه. برای مثال حافظه، Lookها، thread،fileها ، و غیره از منابعی هستند که باید در اصطلاح Acquire بشن و بعد release بشن. اگر برنامه ای به صورتی رفتار کنه که منابعی رو در اختیاربگیره و وقتی که کارش با اونا تموم شد اونا رو آزاد نکنه می گیم که اون منبع داره Leak میشه. Leak شدن منابع می تونه باعث کاهش performance بشه و حتی می تونه باعث crash توی برنامه بشه. Componentهای کتابخونه استاندارد طوری طراح شدند که leak نداشته باشن. براین اینکار از constructor و Destructor استفاده می کنن تا مطمئن بشن که resourceها بیش تر از نیاز زنده نمی مونن. مثلا توی وکتور با Destruct کردن المانهای داخلش، lifetime اونا رو زمانی که نیازی بهشون نیست کنترل میکنه.
  4. توی این مثال نحوی استفاده از Constructor و Destructor رو برای مدیریت منابع می بینیم. وقتی این تابع اجرا بشه بقیه ی Threadها زمانی که constructor متغییر lck اجرا بشه و mutex m رو acquire کنه دیگه پیش نمی رن و اجراشون متوقف میشه تا زمانی که destructor متغییر lck اجرا بشه و از این تابع بیاد بیرون. یکی از موارد استفاده ی Resource Acquisition Is Initialization یا به اختصار RAII همین هست. با این تکنیک می شه resourceها رو مدیریت کرد. از RAII توی بقیه containerها مثل وکتور و map و غیره هم استفاده میشه.در حقیقت RAII طور کار میکنه که وقتی وارد یه اسکوپ میشه و یه شئ رو تعریفم می کنیم ، Constructor اونو اجرا می کنه و بعد از اینکه از اسکوپ خارج میشه destructor اون شئ اجرا میشه.
  5. در مثال قبلی ما با استفاده از RAII و ورود و خروج از اسکوپ تونستیم resourceها رو مدیریت کنیم. اما اگه یه متغییر یا Objectیی توی Heap باشه با این روش نمیشه مدیریتش کرد. کتابخونه استاندارد با امکاناتی که توی هدر فایل memory هست یه سری smart pointer به ما میده که این کار رو با کمک اونا می تونیم انجام بدیم. با استفاده از unique_ptr به صورت انحصاری یه resource رو در اختیار می گیریم وبا shared_ptr یه resource رو بین چند نفر به اشتراک می ذاریم .مهمترین کاربرد smart pointerها جلوگیری از leak شدن memory هست. توی این مثال ما یه حالتی رو بررسی می کنیم که برنامه نویس فراموش می کنه که زمانی که از تابع خارج میشه pointer ی p رو delete کنه.در شرط های i<99 و i<77 از اسکوپ خارج میشیم در اولی با exception و در دومی با return ولی در هیچ کدوم اشارگر p رو که newکردیم delete نکردیم. ولی Unique_ptr همیشه زمانی که به هر نحوی از اسکوپ خارج بشنم destruct میشه و منابعی که در اختیار داره رو delete میکنه . در حقیقت ما از این نکته داریم استفاده می کنیم که اگه یه object به نام x به صورت local تعریف کنیم و اونو new نکنیم در انتهای اسکوپی که قرارداره destruct میشه. اما همه جا این تکنیک جواب نمیده و ما یه جاهایی مجبوریم که از pinter استفاده کنیم، اون جاهایی که مجبوریم از pointer استفاده کنیم، میتونیم از smart pointerها استفاهد کنیم. Unique_ptr نسبت به زمانی که شما بخواید از یه Pointer معمولی درست استفاده کنید هیچ سرباری نداره. زمانی هم که یه unique_ptr رو از یه تابع return میکنید، به صورت خودکار Move میشه تا efficient باشه.
  6. با unique_ptr می تونیم lifetime یه object رو مدیریت کنیم. Ownership یا مالکیت در Unique_ptr دست یه نفر هست و در مورد اینکه به یه Object نیاز داره یا نه اون یه نفری که unique_ptr رو در اختیار داره تصمیم میگیره. در مقابل unique_ptr ما shared_ptr رو داریم که اون Objectیی که قراره مدیریت بشه بین چند نفر به اشتراک گذاشته شده. بر خلاف unique_ptr که اکثرا move میشه Share_ptr اکثرا copy میشه. زمانی resource رو آزاد میکنه که دیگه کسی اون رو لازم نداشته باشه و آخرین نفری که از این resource مشترک استفاده میکنه هم اعلام کنه که دیگه بهش احتیاجی نداره. پس تا زمانی که حداقل یه نفر باشه که از shared_ptr استفاده می کنه destruct نمیشه. در این مثال با استفاده از shared_ptr یه فایل رو باز میکنیم و بعد مطمئن میشیم که باز شده. بعد اون share_ptr رو بین دو تا تابع f و g به اشتراک میذاریم. زمانی که از آخرین تابع یعنی g خارج بشیم و اسکوپ ما از user هم خارج بشه فایل به صورت اوتوماتیک بسته میشه، چون دیگه کسی نیست که از اون استفاده کنه. در واقع Shared_ptr یه نوع garbage collection برای ما فراهم میکنه. این قابلیت garbage collection یه مقدار هزینه داره چون باید حساب کسانی که دارن از این resource استفاده می کنن رو نگه داره. استفاده از shared_ptr، lifetime یه object رو یه کم غیر قابل پیش بینی می کنه. از Shared_ptr زمان استفاده می کنیم که نیاز داریم ownership یه object رو shareکنیم. با داشتن unique_ptr و shared_ptr تقریبا استفاده از new و delete مستقیم به حداقل میرسه و حتی میشه برنامه هایی نوشت که new و delete نخوان. اما در هر صورت اینا مفاهیم هستند که مشابه Pointer هستند و در همین حد هم باقی می مونن چون ما اکثرا از containerها و مفاهیم سطح بالا تری برای resource management استفاده می کینیم.
  7. به صورت خلاصه برای اینکه بدونیم چه مواقعی ما از smart pointerها استفاده می کنیم این موارد رو باید مد نظر قرار بدیم. هر زمانی که ما نیاز داریم که از semantic اشاره گر استفاده کنیم می تونیم از smart pointerها بهره ببریم. مثلا زمانی که ما نیاز داریم که یه Object رو بین چند نفر share کنیم نیاز داریم که اونو با pointer یا reference در دسترس قرار بدیم. اگه اون resource بین چند نفر share بشه از shared_ptr استفاده می کنیم و اگه فقط یک نفر از اون استفاده میکنه از unique_ptr استفاده می کنیم. زمانی که به Objectهای polymorphic نیاز داریم باید از Pointer استفاده کنیم چون از virtual funciton استفاده می کنن و مکانیزم virtual functionها ما رو ملزم به استفاده از Pointer میکنه. در این مواقع ما می تونیم از unique_ptr استفاده کنیم. زمانی که فقط می خوایم objectهایی که polymorphic هستند رو به اشتراک بذاریم معمولا از shared_ptr استفاده کنیم.
  8. در این ویدیو در مورد مدیریت منابع و smart pointer ها بحث کردیم و نکاتی که برای استفاده از اونا باید بهش توجه کنیم رو گفتیم.