عندما تقوم بإضافة عنوان &mid
إلى الفيكتور tv
، فإنك تقوم بإضافة عنوان محلي لمتغير mid
الذي يتم إنشاؤه في كل تكرار من الحلقة for
، ولكن بمجرد انتهاء التكرار، يتم تدمير المتغير mid
وبالتالي لا يمكن الوصول إليه بعد ذلك. وبسبب ذلك، يبقى عنوان &mid
الذي تمت إضافته لكل عنصر في الفيكتور tv
يشير إلى مكان غير صالح في الذاكرة، وهذا هو السبب في أن جميع عناصر tv
تبدو بأنها تحتوي على نفس العنوان.
لحل هذه المشكلة، يجب عليك إنشاء كائن treenode
جديد في كل تكرار من الحلقة for
باستخدام العامل new
لحجز مساحة في الذاكرة له. على سبيل المثال:
cppvector tv;
for (int i = 0; i < v.size(); i++)
{
treenode* mid = new treenode; // انشاء treenode جديد
mid->val = v[i];
mid->l = NULL;
mid->r = NULL;
tv.push_back(mid); // إضافة العنوان الجديد لل tV
}
باستخدام new
، يتم إنشاء كائن treenode
جديد في كل تكرار من الحلقة، وسيتم الاحتفاظ بهذه الكائنات في الذاكرة حتى يتم تحريرها يدويا باستخدام delete
عندما لا يعد هناك حاجة إليها.
المزيد من المعلومات
عند استخدام new
لإنشاء كائن جديد، يتم حجز مساحة في الذاكرة الخاصة بالكائن ويتم إرجاع عنوان هذه المساحة. وعند استخدام push_back
لإضافة هذا العنوان إلى الفيكتور، فإنه يتم تخزين العنوان الجديد وليس نسخة من الكائن نفسه. وبالتالي، يمكن الوصول إلى الكائن المخزن في الذاكرة باستخدام العنوان المخزن في الفيكتور.
ومن الجدير بالذكر أنه عند الانتهاء من استخدام الكائنات التي تم إنشاؤها باستخدام new
، يجب عليك تحرير الذاكرة التي تم حجزها باستخدام delete
لتجنب تسريب الذاكرة. وذلك عن طريق القيام بشيء مثل:
cppfor (int i = 0; i < tv.size(); i++)
{
delete tv[i]; // تحرير الذاكرة المخصصة لل tV
}
هذا يتيح للنظام معرفة أن الذاكرة التي تم حجزها للكائنات لم تعد مستخدمة ويمكن إعادة استخدامها في وقت لاحق.