C++ Tutorial - part 82

آموزش جامع زبان برنامه‌نویسی C++ مقدماتی تا پیشرفته [0 تا 100 سی پلاس پلاس بهمراه حل تمرین و پروژه ✅] - توضیحات اولیه - قسمت 82

مقدمه

در قسمت‌های قبلی دوره، کاربرد و مشکلات پوینترهای معمولی بررسی شد و با معرفی اسمارت پوینترها، از جمله std::unique_ptr، سعی شد تا مشکلات مموری لیک کاهش یابد. در این بخش، قصد داریم تا با std::unique_ptr به طور کامل آشنا شویم و نحوه استفاده و ویژگی‌های آن را بررسی کنیم.

1. معرفی std::unique_ptr

std::unique_ptr یکی از انواع اسمارت پوینترها در C++ است که به منظور مدیریت خودکار منابع حافظه استفاده می‌شود. برخلاف پوینترهای معمولی که ممکن است باعث مموری لیک شوند، std::unique_ptr با اختصاص و آزادسازی حافظه به طور خودکار، این مشکل را حل می‌کند.

تعریف و ویژگی‌های کلیدی:

  • یونیک: std::unique_ptr فقط یک مالک برای هر شیء دارد. این به این معنی است که تنها یک unique_ptr می‌تواند به یک شیء اشاره کند و هیچ‌کس دیگری نمی‌تواند به همان شیء اشاره کند.
  • مدیریت حافظه: هنگامی که std::unique_ptr خارج از محدوده‌ی خود می‌شود، حافظه‌ای که به آن اختصاص داده شده، به طور خودکار آزاد می‌شود.

کد نمونه:

				
					#include <iostream>
#include <memory> // برای std::unique_ptr

int main() {
    // ایجاد یک unique_ptr به یک عدد صحیح با مقدار 25
    std::unique_ptr<int> uptr1 = std::make_unique<int>(25);

    // نمایش مقدار
    std::cout << "Value: " << *uptr1 << std::endl;

    // نمایش آدرس
    std::cout << "Address: " << uptr1.get() << std::endl;

    // تغییر مالکیت
    std::unique_ptr<int> uptr2 = std::move(uptr1);

    // نمایش نتیجه
    if (uptr1) {
        std::cout << "uptr1 exists" << std::endl;
    } else {
        std::cout << "uptr1 does not exist" << std::endl;
    }

    if (uptr2) {
        std::cout << "uptr2 exists with value: " << *uptr2 << std::endl;
    } else {
        std::cout << "uptr2 does not exist" << std::endl;
    }

    return 0;
}

				
			

2. ایجاد و استفاده از std::unique_ptr

برای استفاده از std::unique_ptr، ابتدا باید هدر <memory> را شامل کنید. سپس می‌توانید std::unique_ptr را به دو روش مختلف ایجاد کنید:

  1. با استفاده از std::make_unique:
				
					std::unique_ptr<int> uptr = std::make_unique<int>(25);

				
			

2. با استفاده از new (نه توصیه شده به دلیل استفاده از std::make_unique):

				
					std::unique_ptr<int> uptr(new int(25));

				
			

کد نمونه:

				
					#include <iostream>
#include <memory>

int main() {
    // روش اول
    std::unique_ptr<int> uptr1 = std::make_unique<int>(25);
    std::cout << "Value: " << *uptr1 << std::endl;

    // روش دوم (توصیه نمی‌شود)
    std::unique_ptr<int> uptr2(new int(30));
    std::cout << "Value: " << *uptr2 << std::endl;

    return 0;
}

				
			

 

3. ویژگی‌های std::unique_ptr

  • انتقال مالکیت: انتقال مالکیت شیء به std::unique_ptr دیگر با استفاده از std::move ممکن است.
  • تعیین آدرس و مقدار: می‌توانید از متدهای get و reset برای دسترسی به آدرس و تغییر مقدار استفاده کنید.

کد نمونه برای انتقال مالکیت:

				
					#include <iostream>
#include <memory>

int main() {
    std::unique_ptr<int> uptr1 = std::make_unique<int>(25);
    std::cout << "Value before move: " << *uptr1 << std::endl;

    std::unique_ptr<int> uptr2 = std::move(uptr1);
    if (uptr1) {
        std::cout << "uptr1 exists" << std::endl;
    } else {
        std::cout << "uptr1 does not exist" << std::endl;
    }

    if (uptr2) {
        std::cout << "uptr2 exists with value: " << *uptr2 << std::endl;
    }

    return 0;
}

				
			

کد نمونه برای reset:

				
					#include <iostream>
#include <memory>

int main() {
    std::unique_ptr<int> uptr = std::make_unique<int>(25);
    std::cout << "Value before reset: " << *uptr << std::endl;

    uptr.reset(new int(30));
    std::cout << "Value after reset: " << *uptr << std::endl;

    return 0;
}

				
			

4. نتیجه‌گیری

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

منابع خارجی مرتبط

ادامه دوره (قسمت 83)

در قسمت بعدی به اشاره‌گر اشتراکی (Shared Pointer) خواهیم پرداخت. اگر سوالی دارید، در بخش دیدگاه مطرح کنید. همچنین ممنون میشم با حمایت دلنشینتون از من و دوره‌ها حمایت کنید.

در این قسمت از دوره آموزشی C++، به بررسی مفاهیم پیشرفته‌تر اشاره‌گرها (پوینترها) و معرفی اسمارت پوینترها می‌پردازیم و...

در این قسمت، قصد داریم تا با shared_ptr به طور کامل آشنا شویم و...

اشاره‌گر یونیک در ++C

حق کپی ویدئو مجاز نمی‌باشد

قسمت:

جلسه هشتاد و دو

نام دوره:

آموزش جامع ++C

زمان ویدئو:

15 دقیقه

مدرس:

مهدی کاظمی

در این قسمت یادخواهید گرفت:

در قسمت‌های قبلی دوره، کاربرد و مشکلات پوینترهای معمولی بررسی شد و با معرفی اسمارت پوینترها، از جمله std::unique_ptr، سعی شد تا مشکلات مموری لیک کاهش یابد. در این بخش، قصد داریم تا با std::unique_ptr به طور کامل آشنا شویم و نحوه استفاده و ویژگی‌های آن را بررسی کنیم.

مهدی کاظمی

سلام مهدی کاظمی هستم و باعث افتخارم هست که در یک دوره جذاب دیگه با شما هستم و قراره در کنار هم از یادگیریمون لذت ببریم.

با بانک سوالات طبقه بندی شده ++C مقدماتی تا پیشرفته، جامع ترین منبع برای تسلط بر زبان سی پلاس پلاس و آمادگی کامل برای دروس مبانی و پیشرفته کامپیوتر در رشته مهندسی کامپیوتر را در اختیار خواهید داشت.

0 دیدگاه
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها