در حال بارگذاری...

اشاره‌گرهای هوشمند

اشاره‌گرهای هوشمند در سی‌پلاس‌پلاس کلاس‌هایی هستند که مدیریت خودکار حافظه و چرخه عمر اشیاء را بر عهده دارند. برخلاف اشاره‌گرهای معمولی که نیازمند آزادسازی دستی حافظه هستند، اشاره‌گرهای هوشمند به محض خروج از محدوده (scope) مسئول آزادسازی منابع می‌شوند و به این ترتیب از نشت حافظه جلوگیری می‌کنند. از انواع رایج آن‌ها می‌توان به unique_ptr (مالکیت منحصر به فرد)، shared_ptr (مالکیت مشترک با شمارش مرجع) و weak_ptr (اشاره‌گر ضعیف برای جلوگیری از چرخه‌های مرجع) اشاره کرد.
استفاده از اشاره‌گرهای هوشمند در توسعه نرم‌افزارهای پیچیده بسیار حیاتی است؛ زیرا با ترکیب آن‌ها با ساختارهای داده‌ای، الگوریتم‌ها و اصول برنامه‌نویسی شیءگرا می‌توان کد امن، قابل نگهداری و بهینه تولید کرد. این آموزش به شما یاد می‌دهد که چگونه از unique_ptr، shared_ptr و weak_ptr در پروژه‌های واقعی بهره ببرید و آن‌ها را با کانتینرهای STL و الگوریتم‌ها ادغام کنید.
با تسلط بر اشاره‌گرهای هوشمند، برنامه‌نویس می‌تواند از خطاهای رایج مانند نشت حافظه و چرخه‌های مرجع جلوگیری کند و در عین حال مفاهیم پیشرفته‌ای مانند مالکیت، مدیریت منابع و طراحی نرم‌افزار مدرن را عمیق‌تر درک نماید.

مثال پایه

text
TEXT Code
\#include <iostream>
\#include <memory>
\#include <string>

class Karmand {
public:
Karmand(const std::string& name) : name_(name) {
std::cout << "کارمند " << name_ << " ایجاد شد.\n";
}
\~Karmand() {
std::cout << "کارمند " << name_ << " حذف شد.\n";
}
void show() const {
std::cout << "نام: " << name_ << "\n";
}
private:
std::string name_;
};

int main() {
std::unique_ptr<Karmand> k1 = std::make_unique<Karmand>("علی");
k1->show();

std::shared_ptr<Karmand> k2 = std::make_shared<Karmand>("رضا");
std::shared_ptr<Karmand> k3 = k2;
k2->show();
k3->show();

std::weak_ptr<Karmand> kWeak = k2;
if (auto kLock = kWeak.lock()) {
kLock->show();
}

return 0;

}

در این مثال، کلاس Karmand شامل سازنده، مخرب و متد show است. unique_ptr برای علی استفاده شده و مالکیت منحصر به فرد را تضمین می‌کند و حافظه به‌طور خودکار آزاد می‌شود. shared_ptr برای رضا استفاده شده و امکان اشتراک‌گذاری مالکیت بین چند اشاره‌گر فراهم می‌کند. weak_ptr یک اشاره‌گر ضعیف به رضا ایجاد می‌کند تا از چرخه‌های مرجع جلوگیری کند و با lock() قابل دسترسی است. این کد نشان می‌دهد که چگونه استفاده از اشاره‌گرهای هوشمند باعث جلوگیری از نشت حافظه، مدیریت واضح مالکیت و ادغام با ساختارهای STL می‌شود. همچنین، این شیوه، نگهداری و امنیت کد در پروژه‌های پیچیده را افزایش می‌دهد.

مثال کاربردی

text
TEXT Code
\#include <iostream>
\#include <memory>
\#include <vector>
\#include <algorithm>

class Task {
public:
Task(int id) : id_(id) {
std::cout << "تسک " << id_ << " ایجاد شد.\n";
}
\~Task() {
std::cout << "تسک " << id_ << " حذف شد.\n";
}
void execute() const {
std::cout << "اجرای تسک " << id_ << ".\n";
}
private:
int id_;
};

int main() {
std::vector\<std::shared_ptr<Task>> taskQueue;

for (int i = 1; i <= 5; ++i) {
taskQueue.push_back(std::make_shared<Task>(i));
}

std::for_each(taskQueue.begin(), taskQueue.end(), [](const std::shared_ptr<Task>& t){
t->execute();
});

taskQueue.clear();

return 0;

}

این مثال کاربردی، استفاده از اشاره‌گرهای هوشمند در سناریوهای واقعی را نشان می‌دهد. کلاس Task با shared_ptr در یک vector ذخیره شده و الگوریتم std::for_each برای اجرای هر تسک استفاده می‌شود. با پاک‌سازی vector، همه اشیاء به‌طور خودکار حذف می‌شوند. این کد بهترین شیوه‌ها مانند اجتناب از اشاره‌گرهای معمولی، مدیریت مالکیت صحیح و ادغام با الگوریتم‌ها و کانتینرهای STL را نشان می‌دهد و اطمینان می‌دهد که منابع به شکل امن و بهینه مدیریت می‌شوند.

بهترین شیوه‌ها شامل استفاده از unique_ptr برای مالکیت منحصر به فرد، shared_ptr برای مالکیت مشترک و weak_ptr برای جلوگیری از چرخه‌های مرجع است. unique_ptr قابل کپی نیست و برای انتقال باید از std::move استفاده کرد. اشاره‌گرهای هوشمند به‌طور خودکار حافظه را در صورت وقوع استثناء آزاد می‌کنند. shared_ptr دارای overhead شمارش مرجع است و بهتر است هرگاه ممکن است از unique_ptr استفاده شود. برای دیباگ، weak_ptr.lock() اعتبار شیء را بررسی می‌کند. از دسترسی به اشیاء خارج از محدوده و چرخه‌های مرجع خودداری کنید و همیشه مالکیت و مدیریت منابع را واضح نگه دارید.

📊 جدول مرجع

سی‌پلاس‌پلاس Element/Concept Description Usage Example
unique_ptr مالکیت منحصر به فرد، آزادسازی خودکار std::unique_ptr<Karmand> k = std::make_unique<Karmand>("علی");
shared_ptr مالکیت مشترک با شمارش مرجع std::shared_ptr<Karmand> k1 = std::make_shared<Karmand>("رضا"); std::shared_ptr<Karmand> k2 = k1;
weak_ptr اشاره‌گر ضعیف، جلوگیری از چرخه‌های مرجع std::weak_ptr<Karmand> w = k1; if(auto l = w\.lock()){ l->show(); }
std::make_unique ایجاد امن unique_ptr auto ptr = std::make_unique<Task>(1);
std::make_shared ایجاد بهینه shared_ptr auto ptr = std::make_shared<Task>(2);

یادگیری اشاره‌گرهای هوشمند امکان مدیریت امن و بهینه حافظه را فراهم می‌کند و قابلیت نگهداری و امنیت کد سی‌پلاس‌پلاس را افزایش می‌دهد. تسلط بر unique_ptr، shared_ptr و weak_ptr و ادغام آن‌ها با کانتینرهای STL و الگوریتم‌ها، گام مهمی در توسعه نرم‌افزار پیشرفته است. مراحل بعدی شامل مطالعه RAII، حافظه اختصاصی و استفاده از اشاره‌گرهای هوشمند در محیط‌های چند نخی است. پروژه‌های عملی و منابع مستندات رسمی سی‌پلاس‌پلاس، کتب پیشرفته مدیریت حافظه و پروژه‌های متن‌باز برای یادگیری عمیق توصیه می‌شوند.

🧠 دانش خود را بیازمایید

آماده شروع

Test Your Knowledge

Test your understanding of this topic with practical questions.

3
سوالات
🎯
70%
برای قبولی
♾️
زمان
🔄
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود