البرمجة

استخدام std::vector في إدارة الذاكرة

قد يكون السبب في الخطأ الذي تواجهه هو استخدامك لدالة realloc بشكل غير صحيح. عند استخدام malloc لحجز الذاكرة لنوع معين من الكائنات، يجب أن تستخدم free لتحرير هذه الذاكرة عندما لا تعد بحاجة إليها بعد. ومن الجدير بالذكر أن realloc قد لا تعمل بشكل صحيح مع الذاكرة التي تم حجزها باستخدام malloc إذا كانت الذاكرة الجديدة ليست متتالية بشكل صحيح.

عند استخدام realloc في الشيفرة التي قدمتها، يجب تخزين ناتجها في متغير آخر. لأن realloc قد تقوم بتغيير عنوان الذاكرة المخصصة إذا لزم الأمر، ولذا من الضروري استخدام المؤشر الجديد الذي تعيده realloc.

وبما أنك تحتاج إلى زيادة طول الكائنات الخاصة بك، يمكنك استخدام std::vector بدلاً من malloc و realloc. هذا النوع يدير الذاكرة تلقائيًا ويعالج زيادة الحجم بشكل أكثر فعالية.

فيما يلي كيفية تحديث الشيفرة باستخدام std::vector بدلاً من malloc و realloc:

cpp
#include #include using namespace std; class Perro { public: virtual int getEdad() = 0; }; class Perrito : public Perro { private: char* name; int age; public: Perrito(char* n, int a) : name(n), age(a) {} int getEdad() { return age; } }; int main() { vector obj; for (int i = 0; i < 10; i++) { obj.push_back(new Perrito((char*)"d", i)); } for (int i = 10; i < 12; i++) { obj.push_back(new Perrito((char*)"d", i)); } for (int i = 0; i < 12; i++) { Perrito* p = dynamic_cast(obj[i]); if (p) { cout << p->getEdad() << endl; } } // Freeing memory for (int i = 0; i < obj.size(); i++) { delete obj[i]; } return 0; }

هذا الكود يستخدم std::vector لإدارة الذاكرة تلقائيًا، ولا يتطلب استخدام malloc أو realloc. كما يستخدم أيضًا دورة for range للوصول إلى عناصر الفيكتور بدلاً من استخدام الفهرس المباشر.

المزيد من المعلومات

بالطبع، هنا بعض المعلومات الإضافية التي قد تكون مفيدة بشأن استخدام realloc واستبداله بـ std::vector في الشيفرة السابقة:

  1. realloc:

    • تستخدم realloc لتغيير حجم الذاكرة المخصصة سابقًا.
    • عند استخدام realloc، قد يتم نقل البيانات إلى موقع ذاكرة جديد، ولذا يجب عليك تحديث المؤشر بالقيمة الجديدة التي تُعيد realloc.
  2. std::vector:

    • يوفر std::vector واجهة أكثر أمانًا وسهولة في استخدامها لإدارة تخصيص الذاكرة.
    • يقوم std::vector بإدارة تخصيص الذاكرة تلقائيًا ويقوم بتحرير الذاكرة بشكل آلي عندما يتم تدميره.
    • يمكن أيضًا استخدامه للحلقات والعمليات الأخرى بسهولة، مما يجعل الكود أقل عرضة للأخطاء وأكثر قابلية للصيانة.
  3. تحرير الذاكرة:

    • يجب دائمًا تحرير الذاكرة التي تم تخصيصها بواسطة malloc أو new باستخدام free أو delete عندما لا تكون بعد مطلوبة.
    • في الشيفرة المعدلة باستخدام std::vector، تتم عملية تحرير الذاكرة تلقائيًا عند تدمير الفيكتور في نهاية البرنامج.
  4. أمان النوع:

    • استخدم dynamic_cast للتحقق من نوع الكائنات التي تتم إدخالها إلى std::vector، مما يساعد في تفادي الأخطاء والتأكد من أن الاسترجاع الآمن للبيانات يتم بشكل صحيح.
  5. عناصر الفيكتور:

    • يمكن الوصول إلى عناصر std::vector باستخدام دورة for range بدلاً من استخدام الفهرس المباشر، مما يجعل الكود أكثر وضوحًا وأقل عرضة للأخطاء.
  6. إدارة الذاكرة:

    • باستخدام std::vector، لن تحتاج بعد الآن للقلق بشأن إدارة الذاكرة يدويًا، مما يجعل البرنامج أكثر استقرارًا وأمانًا وسهولة في الصيانة.

باستخدام هذه المعلومات، يمكنك الآن فهم الفرق بين استخدام realloc واستخدام std::vector، والتوجه نحو استخدام الأخير بشكل أفضل في الكثير من الحالات.

مقالات ذات صلة

زر الذهاب إلى الأعلى

المحتوى محمي من النسخ !!