طرز استفاده از اشاره گرهای هوشمند - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

طرز استفاده از اشاره گرهای هوشمند

+2 امتیاز

سلام.

دوستان من این تاپیک و خوندم : اینجا

ولی فقط تا حدودی کار اون توابع رو فهمیدم.که این کد رو هم زدم ولی  کامپایل نشد:

#include "stdafx.h"
#include <iostream>
#include <memory>
#include <vector>
int main()
{
	unique_ptr<int[]> a(new int [2]);
	a[0] = 22;
	a[1] = 33;

  system ("pause");
}

 

اگه کسی بیاد یه راهنمایی کنه و یا یه کدی بزاره تا ماهم بفهمیم که اینا چیه و چیکار میکنه ، بسیار ممنون میشم ازش .

اصلا چرا باید ازش استفاده کنیم؟

 

با تشکر.

 

 

سوال شده شهریور 9, 1393  بوسیله ی hosseinam1370 (امتیاز 163)   8 22 34
دوباره تگ گذاری شد شهریور 10, 1393 بوسیله ی BlueBlade

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

سلام unique_ptr داخل فضای نام std:: هست برای استفاده باید به این شکل عمل کرد  std::unique_ptr یا using namespace std

#include <iostream>
#include <memory>
int main()
{
	std::unique_ptr<int[]> a(new int[2]);
	a[0] = 22;
	a[1] = 33;

	std::cout<< a[1];
	system("pause");
}

 

اگه کسی بیاد یه راهنمایی کنه و یا یه کدی بزاره تا ماهم بفهمیم که اینا چیه و چیکار میکنه ، بسیار ممنون میشم ازش .

اصلا چرا باید ازش استفاده کنیم؟

ببینید new یک عیبی که داره اگر بعد از استفاده ازش از delete استفاده نشه حافظه ای که گرفتید پاک نمیشه که این پاک نشدن هم مشکلات امنیتی داره و هم برنامه حافظه ممکنه  کم بیاره و هم این که سرعت برنامه میاد پایین.

 برای این که بصورت خودکار حافظه پاک بشه از این کلاس ها استفاده می کنن . چون delete کردن هم ممکنه فراموش بشه و هم این که ممکنه بخاطر برگرداندن exception از تابع یا return شدن انجام نشه و هم این که ممکنه اشتباها از delete[] بجای delete استفاده کنین ! .

این تابع رو ببینید شاید در نگاه اول بنظر برسه مشکلی نداره چون از delete هم استفاده کردیم !

int func()
{
     int* a=new int[10];
      a[0]=5;
      if(a[0]==3)
           return 5;
       int* b=new int[10000];
       std::string* c=new std::string[5];
       func2();
      delete[] a;
      delete c;
      return 1;
}

ولی با یک نگاه عمیق تر ببینید چه اشتباهاتی رخ داده!  : 

int func()
{
     int* a=new int[10];
      a[0]=5;
      if(a[0]==5)
           return 5;//inja return kardim delete[] anjam nemishe va a pak nemishe

       int* b=new int[10000];//agar hafeze kam bashe(kamtar az 10000 ta int) exception bargasht dade mishe va  a pak nemishe !
      std::string* c=new std::string[5];

      func2();//in yek func dg hast baz ham momkene exception bargardoone  !

     delete[] a;//ba in ke delete[] ro neveshtim baz ham kheili vaght ha a pak nemishe !!
    //inja yademoon rafte delete[] b ro benevisim !

    delete c;//az new[] estefade kardim pas bayad az delete[] estefade she ke eshtebahan az delete estefade shode inja ham hafeze dorost pak nemishe ! undefine behavior ham hast
 
    return 1;
}

 

مثلا این کد که مربوط به یکی از کتابخانه های شبکه هست رو ببینید https://github.com/facebook/fbthrift/blob/master/thrift/perf/cpp/AsyncLoadHandler2.h

تمام توابع ورودیشون بجای اشاره گر معمولی از نوع unique_ptr هست .

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