في الكود الذي قدمته، يبدو أن هناك مشكلة في كيفية التعامل مع الذاكرة وتحديدًا في جزء متعلق بتخصيص الذاكرة لـ Seat
objects. الخطأ الذي تحصل عليه (std::bad_alloc
) يشير عمومًا إلى فشل في تخصيص الذاكرة.
أحد الأماكن التي يمكن أن تكون مصدر المشكلة هي هذا الجزء:
cpptickets[ticketCount].seatInfo = new Seat[tickets[ticketCount].getSize()];
Seat[tickets[ticketCount].groupSize];
يبدو أن هناك خللًا في كيفية استخدام new
وتخصيص الذاكرة هنا. يبدو أن السطر الثاني ليس في مكانه المناسب، وربما كان ينبغي أن يكون جزءًا من السطر الأول.
يمكنك تعديل هذا الجزء من الكود إلى شكل أكثر صحة كما يلي:
cpptickets[ticketCount].seatInfo = new Seat[tickets[ticketCount].getSize()];
بعد تحديد حجم الـ Seat
array بنجاح، يمكنك الآن استخدامه بشكل صحيح في باقي الكود.
علاوة على ذلك، يمكنك التفكير في استخدام مراقبة ذكاء للتأكد من أنك لا تتعامل مع الذاكرة بشكل غير صحيح، مثل التحقق مما إذا كان الاستدعاء لـ new
ناجحًا أم لا.
cpptickets[ticketCount].seatInfo = new Seat[tickets[ticketCount].getSize()];
if (tickets[ticketCount].seatInfo == nullptr) {
// فشل في تخصيص الذاكرة، قم بمعالجة الخطأ هنا
// يمكنك أيضًا رمي استثناء أو الإفراج عن الذاكرة المخصصة بالفعل
}
هذا قد يساعد في تجنب الأخطاء المرتبطة بتخصيص الذاكرة. كما يُفضل أيضًا النظر في استخدام مراجع (std::unique_ptr
أو std::shared_ptr
) لتجنب تسريب الذاكرة.
المزيد من المعلومات
بالطبع، دعنا نتناول المزيد من المعلومات حول الكود والخطأ الذي واجهته. يبدو أن الكود الخاص بك هو جزء من برنامج يقوم بقراءة بيانات من ملف نصي (hi.txt
) ويقوم بتخزينها في مصفوفة من كائنات Ticket
. هذا البرنامج يظهر أيضًا أنه يستخدم توجيه goto
في بعض الأماكن لتجنب تكرار الشيفرة.
لفهم السياق بشكل أفضل، يمكننا التركيز على بعض النقاط الرئيسية في الكود:
-
قراءة البيانات من الملف:
- يتم فتح الملف
hi.txt
باستخدامifstream
، وتحقق من نجاح الفتح. - يتم قراءة البيانات من الملف باستخدام
inputFile >> category
وinputFile >> data
. - يتم استخدام هيكل التحكم
while (!inputFile.eof())
للتحقق من نهاية الملف.
- يتم فتح الملف
-
تخصيص الذاكرة:
- يتم تخصيص الذاكرة لـ
Seat
array باستخدامnew
عند قراءة الفئة “Size:”. - هناك استخدام
new
آخر لتخصيص الذاكرة لكائنSeat
في الفئة “Price:”.
- يتم تخصيص الذاكرة لـ
-
استخدام التوجيه
goto
:- يتم استخدام
goto READ_DATA;
لتجنب تكرار الشيفرة عند قراءة الفئة “Name:”.
- يتم استخدام
-
الخطأ الحالي:
- يبدو أن الخطأ يحدث عند تخصيص الذاكرة للـ
Seat
array.
- يبدو أن الخطأ يحدث عند تخصيص الذاكرة للـ
للمساعدة في تحديد سبب الخطأ بشكل أفضل، يمكنك إلقاء نظرة على الأمور التالية:
- التأكد من أن القيم التي تُستخدم لتحديد حجم
Seat
array هي قيم صحيحة. - التأكد من عدم حدوث تكرار في تخصيص الذاكرة.
- التحقق من الاستخدام السليم للذاكرة في كل مكان في البرنامج.
من الضروري أيضًا تحديد السبب الذي أدى إلى استخدام goto
في البرنامج، حيث يمكن أن يزيد من صعوبة فهم الشيفرة. يفضل استخدام هياكل التحكم المناسبة مثل if
, else if
, وحلقات while
لتحسين قراءة الشيفرة وصيانتها.