
آموزش جامع زبان برنامهنویسی 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
#include // برای std::unique_ptr
int main() {
// ایجاد یک unique_ptr به یک عدد صحیح با مقدار 25
std::unique_ptr uptr1 = std::make_unique(25);
// نمایش مقدار
std::cout << "Value: " << *uptr1 << std::endl;
// نمایش آدرس
std::cout << "Address: " << uptr1.get() << std::endl;
// تغییر مالکیت
std::unique_ptr 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 را به دو روش مختلف ایجاد کنید:
- با استفاده از std::make_unique:
std::unique_ptr uptr = std::make_unique(25);
2. با استفاده از new (نه توصیه شده به دلیل استفاده از std::make_unique):
std::unique_ptr uptr(new int(25));
کد نمونه:
#include
#include
int main() {
// روش اول
std::unique_ptr uptr1 = std::make_unique(25);
std::cout << "Value: " << *uptr1 << std::endl;
// روش دوم (توصیه نمیشود)
std::unique_ptr uptr2(new int(30));
std::cout << "Value: " << *uptr2 << std::endl;
return 0;
}
3. ویژگیهای std::unique_ptr
- انتقال مالکیت: انتقال مالکیت شیء به std::unique_ptr دیگر با استفاده از std::move ممکن است.
- تعیین آدرس و مقدار: میتوانید از متدهای get و reset برای دسترسی به آدرس و تغییر مقدار استفاده کنید.
کد نمونه برای انتقال مالکیت:
#include
#include
int main() {
std::unique_ptr uptr1 = std::make_unique(25);
std::cout << "Value before move: " << *uptr1 << std::endl;
std::unique_ptr 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
#include
int main() {
std::unique_ptr uptr = std::make_unique(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 به طور کامل آشنا شویم و نحوه استفاده و ویژگیهای آن را بررسی کنیم.
