Reassigning std::unique_ptr with make_unique – Memory Management
عند تنفيذ السطرين في الشيفرة الخاصة بك:
cppauto buff = std::make_unique<int[]>(128);
buff = std::make_unique<int[]>(512);
ستحدث الخطوات التالية:
-
الخط الأول
auto buff = std::make_unique
ينشئ متغير(128); buff
من نوعunique_ptr
ويخصص له مساحة في الذاكرة تكفي لتخزين 128 عنصر من نوعint
. وعند نهاية نطاق هذا المتغير، سيتم تلقائياً القضاء على الذاكرة المخصصة باستخدام دالةdelete[]
لتجنب تسريب الذاكرة. -
الخط الثاني
buff = std::make_unique
يخصص مساحة جديدة في الذاكرة بحجم 512 عنصر من نوع(512); int
، ثم يقوم بتعيين متغيرbuff
ليشير إلى هذه المساحة الجديدة. في هذه الحالة، سيتم تلقائياً القضاء على الذاكرة المخصصة في الخط الأول باستخدامdelete[]
، وبالتالي لا توجد تسريب ذاكرة.
بالإجمال، لا توجد حاجة لاستخدام reset
هنا، حيث أن العملية الأخيرة make_unique
مع العملية التعيين =
ستتعامل مع الذاكرة المخصصة بالشكل الصحيح تلقائياً.
المزيد من المعلومات
عند استخدام std::make_unique
لإنشاء std::unique_ptr
، يتم التعامل مع الإدارة الآمنة للذاكرة بشكل تلقائي. عند إعادة تعيين std::unique_ptr
باستخدام operator=
، سيتم تلقائيًا إلغاء تخصيص الذاكرة القديمة وتخصيص ذاكرة جديدة بالحجم الجديد. هذا يعني أنه في الحالة الخاصة التي ذكرتها، لا يوجد تسريب ذاكرة.
ومن الجدير بالذكر أنه في بعض الحالات قد تكون هناك أسباب لاستخدام reset
بدلاً من operator=
، مثل الحاجة إلى إعادة تعيين std::unique_ptr
إلى قيمة خالية (مثل nullptr
) دون إنشاء كائن جديد.