سلام 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 هست .