اشاره گر ها 2 تا مشکل دارن یکی این که اگر بعد از استفاده ازشون پاک نشن اون مقادیر داخل اشاره گر داخل حافظه میمونن که بهش اصطلاحا می گن memory leak
د وم این که ممکنه چند تا اشاره گر داشته باشیم که به یک محل اشاره می کنن این جا هم در صورتی که یکی از اشاره گر ها رو به اشتباه پاک کنیم بقیه اشاره گر ها به محل نادرستی اشاره می کنن که اینم باعث بوجود امدن باگ میشه .
توی c++11 برای حل این جور مشکلات یکسری کلاس نوشته شده : shared_ptr - unique_ptr -weak_ptr
unique_ptr: مخصوص یک اشاره گر خاصه و اجازه دسترسی مشترک رو نمیده .
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
void func()
{
unique_ptr<int[]> a(new int[2]);
a[0]=2;
a[1]=3;
cout<<a[0]+a[1];
//mohtaviat a be soorat khodkar pak mishan
}
int main()
{
func();
}
shared_ptr : اجازه میده که چند تا اشاره گر به یک محل مشترک از حافظه اشاره کنن .
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
int main()
{
shared_ptr<vector<int>> a;
{
shared_ptr<vector<int>> b(new vector<int>());
(*b).push_back(10);
a=b;
}//in ja b pak mishe vali az oonjaiee le a ham be mohtaviat dakhele b eshare mikone etelaat dakhele b pak nemishan
cout<<(*a)[0];
//in ja vector ee ke new shode pak mishe
}
پیاده سازی : شاید سوال پیش بیاد این smart pointer ها چجوری نوشته شدن . از اونجایی که smart pointerی چیزی جز یک کلاس و template که شامل اشاره گر مورد نظره نیست می تونه یک پیاده سازی خیلی خیلی ابتداییش کد زیر باشه :
#include <iostream>
template<class T>
class MySmartPointer
{
public:
MySmartPointer(T* obj)
{
this->pointer_=obj;
}
~MySmartPointer()
{
delete pointer_;
}
T& operator* ()
{
return *pointer_;
}
T* operator-> ()
{
return pointer_;
}
private:
T* pointer_;
};
class Test
{
public:
void func(){std::cout<<1;};
};
int main()
{
MySmartPointer<Test> a(new Test) ;
a->func();
//niazy be pak kardan a nist
}