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

Smart Pointer یا اشاره گر هوشمند

+3 امتیاز
با عرض سلام وخسته نباشید.

smart pointer ها چی هستند و چه وقت باید از آن استفاده کنیم مگه نسبت به اشاره گر های عادی c++ مزیت دارند؟

 

متشکرم
سوال شده آذر 10, 1392  بوسیله ی HaMiDyN (امتیاز 20)   2 2 5
دوباره تگ گذاری شد بهمن 12, 1392 بوسیله ی BlueBlade

3 پاسخ

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

 اشاره گر ها 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
}

 

 

پاسخ داده شده دی 25, 1392 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده بهمن 27, 1392 بوسیله ی BlueBlade
+3 امتیاز

مزیتی که smart pointer ها نسبت به اشاره گرهای معمولی دارند این است که حافظه ای که اینگونه اشاره گرها به آن اشاره می کنند به صورت کاملاً هوشمند آزادسازی می شوند و دیگر نیازی نیست که به صورت دستی آنها را آزادسازی کنیم. در واقع استفاده از اینگونه اشاره گرها کار مدیریت حافظه را خیلی ساده تر می کند و تنظیمات مختلفی را برای مدیریت حافظه در اختیار شما قرار می دهد. توصیه می کنم که برای کسب اطلاعات بیشتر در این خصوص به لینک زیر مراجعه کنید:

http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one

پاسخ داده شده آذر 11, 1392 بوسیله ی r0lex (امتیاز 391)   1 1 9
+4 امتیاز
weak_ptr را نگفتین

weak_ptr مثل shared_ptr اختیار یک شیء را در دست نمی گیره بلگه به عنوان یک مشاهده گر اشیایی که توسط shared_ptr در اختیار گرفته شده اند ازش استفاده میشه با اون میشه فهمید شیئی که تحت نظر گرفته شده وجود داره یا نه . بنابراین weak_ptr با shared_ptr به کار میره
پاسخ داده شده فروردین 11, 1393 بوسیله ی Azar (امتیاز 628)   29 43 61
...