برنامه نویسی

آشنایی با اشاره گرهای هوشمند در C++

Summarize this content to 400 words in Persian Lang

آشنایی با اشاره گرهای هوشمند در C++

مدیریت حافظه به صورت دستی در C++ می تواند بسیار چالش برانگیز باشد، به خصوص زمانی که با طول عمر اشیاء پیچیده سروکار دارید. خوشبختانه، C++11 اشاره گرهای هوشمندی را برای ساده کردن این فرآیند و کمک به جلوگیری از خطاهای رایج مدیریت حافظه مانند نشت حافظه و نشانگرهای آویزان معرفی کرد. در این مقاله، سه نوع اصلی اشاره گر هوشمند ارائه شده توسط کتابخانه استاندارد C++ را بررسی خواهیم کرد: std::unique_ptr، std::shared_ptr، و std::weak_ptr.

اشاره گر هوشمند چیست؟

اشاره‌گر هوشمند شی‌ای است که یک اشاره‌گر خام را می‌پیچد و اطمینان می‌دهد که حافظه اشاره‌شده توسط اشاره‌گر به درستی مدیریت می‌شود. هنگامی که یک اشاره گر هوشمند از محدوده خارج می شود، به طور خودکار شی ای را که به آن اشاره می کند حذف می کند و از نشت حافظه جلوگیری می کند.

1. std::unique_ptr

std::unique_ptr ساده ترین شکل اشاره گر هوشمند است. مالک شیئی است که به آن اشاره می کند و هیچ اشاره گر هوشمند دیگری نمی تواند همان شی را داشته باشد. این تضمین می کند که یک مالک واحد برای شی وجود دارد، که برای مدیریت منابع در شرایطی که مالکیت نباید به اشتراک گذاشته شود مفید است.

#include
#include

int main() {
std::unique_ptrint> uniquePtr = std::make_uniqueint>(10);

std::cout “Unique pointer value: ” *uniquePtr std::endl;

// std::unique_ptr anotherPtr = uniquePtr; // This will cause a compile-time error
std::unique_ptrint> anotherPtr = std::move(uniquePtr); // Transfer ownership
if (!uniquePtr) {
std::cout “uniquePtr is now nullptr.” std::endl;
}

return 0;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نکات کلیدی:

std::unique_ptr اجازه کپی را نمی دهد اما از جابجایی پشتیبانی می کند.
ایده آل برای سناریوهایی که یک موجودیت واحد باید یک شی را مدیریت کند.

2. std::shared_ptr

std::shared_ptr یک اشاره گر هوشمند با شمارش مرجع است. چند نمونه std::shared_ptr می توانند دارای یک شیء مشابه باشند. شی تنها زمانی از بین می رود که آخرین std::shared_ptr که مالک آن است از بین برود یا بازنشانی شود.

#include
#include

int main() {
std::shared_ptrint> sharedPtr1 = std::make_sharedint>(20);
std::shared_ptrint> sharedPtr2 = sharedPtr1; // Shared ownership

std::cout “Shared pointer value: ” *sharedPtr1 std::endl;
std::cout “Reference count: ” sharedPtr1.use_count() std::endl;

sharedPtr2.reset(); // Decrease reference count
std::cout “Reference count after reset: ” sharedPtr1.use_count() std::endl;

return 0;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نکات کلیدی:

std::shared_ptr اجازه مالکیت مشترک را می دهد.
تعداد مراجع را حفظ می کند و تنها زمانی که تعداد به صفر برسد، شی را حذف می کند.

3. std::weak_ptr

std::weak_ptr نوع خاصی از اشاره گر هوشمند است که به تعداد مراجع کمکی نمی کند. برای جلوگیری از ارجاعات دایره ای در موقعیت هایی که دو یا چند نمونه std::shared_ptr به یکدیگر ارجاع می دهند، استفاده می شود که منجر به نشت حافظه می شود.

#include
#include

struct Node {
std::shared_ptrNode> next;
std::weak_ptrNode> prev; // Prevent circular reference
int value;

Node(int val) : value(val) {}
};

int main() {
auto node1 = std::make_sharedNode>(1);
auto node2 = std::make_sharedNode>(2);

node1->next = node2;
node2->prev = node1; // node2 has a weak reference to node1

std::cout “Node1 value: ” node1->value std::endl;
std::cout “Node2 value: ” node2->value std::endl;

return 0;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نکات کلیدی:

std::weak_ptr از وابستگی های چرخه ای جلوگیری می کند.
اغلب همراه با std::shared_ptr استفاده می شود.

نتیجه گیری

اشاره گرهای هوشمند ابزارهای قدرتمندی در C++ هستند که به مدیریت ایمن و کارآمدتر حافظه پویا کمک می کنند. با درک و استفاده صحیح از std::unique_ptr، std::shared_ptr و std::weak_ptr، می‌توانید از مشکلات رایج مانند نشت حافظه و نشانگرهای آویزان جلوگیری کنید. ادغام نشانگرهای هوشمند در پروژه‌های ++C کد شما را تمیزتر، قوی‌تر و نگهداری آسان‌تر می‌کند.

آشنایی با اشاره گرهای هوشمند در C++

مدیریت حافظه به صورت دستی در C++ می تواند بسیار چالش برانگیز باشد، به خصوص زمانی که با طول عمر اشیاء پیچیده سروکار دارید. خوشبختانه، C++11 اشاره گرهای هوشمندی را برای ساده کردن این فرآیند و کمک به جلوگیری از خطاهای رایج مدیریت حافظه مانند نشت حافظه و نشانگرهای آویزان معرفی کرد. در این مقاله، سه نوع اصلی اشاره گر هوشمند ارائه شده توسط کتابخانه استاندارد C++ را بررسی خواهیم کرد: std::unique_ptr، std::shared_ptr، و std::weak_ptr.

اشاره گر هوشمند چیست؟

اشاره‌گر هوشمند شی‌ای است که یک اشاره‌گر خام را می‌پیچد و اطمینان می‌دهد که حافظه اشاره‌شده توسط اشاره‌گر به درستی مدیریت می‌شود. هنگامی که یک اشاره گر هوشمند از محدوده خارج می شود، به طور خودکار شی ای را که به آن اشاره می کند حذف می کند و از نشت حافظه جلوگیری می کند.

1. std::unique_ptr

std::unique_ptr ساده ترین شکل اشاره گر هوشمند است. مالک شیئی است که به آن اشاره می کند و هیچ اشاره گر هوشمند دیگری نمی تواند همان شی را داشته باشد. این تضمین می کند که یک مالک واحد برای شی وجود دارد، که برای مدیریت منابع در شرایطی که مالکیت نباید به اشتراک گذاشته شود مفید است.

#include 
#include 

int main() {
    std::unique_ptrint> uniquePtr = std::make_uniqueint>(10);

    std::cout  "Unique pointer value: "  *uniquePtr  std::endl;

    // std::unique_ptr anotherPtr = uniquePtr; // This will cause a compile-time error
    std::unique_ptrint> anotherPtr = std::move(uniquePtr); // Transfer ownership
    if (!uniquePtr) {
        std::cout  "uniquePtr is now nullptr."  std::endl;
    }

    return 0;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نکات کلیدی:

  • std::unique_ptr اجازه کپی را نمی دهد اما از جابجایی پشتیبانی می کند.
  • ایده آل برای سناریوهایی که یک موجودیت واحد باید یک شی را مدیریت کند.

2. std::shared_ptr

std::shared_ptr یک اشاره گر هوشمند با شمارش مرجع است. چند نمونه std::shared_ptr می توانند دارای یک شیء مشابه باشند. شی تنها زمانی از بین می رود که آخرین std::shared_ptr که مالک آن است از بین برود یا بازنشانی شود.

#include 
#include 

int main() {
    std::shared_ptrint> sharedPtr1 = std::make_sharedint>(20);
    std::shared_ptrint> sharedPtr2 = sharedPtr1; // Shared ownership

    std::cout  "Shared pointer value: "  *sharedPtr1  std::endl;
    std::cout  "Reference count: "  sharedPtr1.use_count()  std::endl;

    sharedPtr2.reset(); // Decrease reference count
    std::cout  "Reference count after reset: "  sharedPtr1.use_count()  std::endl;

    return 0;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نکات کلیدی:

  • std::shared_ptr اجازه مالکیت مشترک را می دهد.
  • تعداد مراجع را حفظ می کند و تنها زمانی که تعداد به صفر برسد، شی را حذف می کند.

3. std::weak_ptr

std::weak_ptr نوع خاصی از اشاره گر هوشمند است که به تعداد مراجع کمکی نمی کند. برای جلوگیری از ارجاعات دایره ای در موقعیت هایی که دو یا چند نمونه std::shared_ptr به یکدیگر ارجاع می دهند، استفاده می شود که منجر به نشت حافظه می شود.

#include 
#include 

struct Node {
    std::shared_ptrNode> next;
    std::weak_ptrNode> prev; // Prevent circular reference
    int value;

    Node(int val) : value(val) {}
};

int main() {
    auto node1 = std::make_sharedNode>(1);
    auto node2 = std::make_sharedNode>(2);

    node1->next = node2;
    node2->prev = node1; // node2 has a weak reference to node1

    std::cout  "Node1 value: "  node1->value  std::endl;
    std::cout  "Node2 value: "  node2->value  std::endl;

    return 0;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نکات کلیدی:

  • std::weak_ptr از وابستگی های چرخه ای جلوگیری می کند.
  • اغلب همراه با std::shared_ptr استفاده می شود.

نتیجه گیری

اشاره گرهای هوشمند ابزارهای قدرتمندی در C++ هستند که به مدیریت ایمن و کارآمدتر حافظه پویا کمک می کنند. با درک و استفاده صحیح از std::unique_ptr، std::shared_ptr و std::weak_ptr، می‌توانید از مشکلات رایج مانند نشت حافظه و نشانگرهای آویزان جلوگیری کنید. ادغام نشانگرهای هوشمند در پروژه‌های ++C کد شما را تمیزتر، قوی‌تر و نگهداری آسان‌تر می‌کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا