سؤال

لدي برنامج فشل مع:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc

أتصور أنه شيء يجب القيام به malloc/free, ، لكنني لا أعرف أي واحد.

ما هي نقطة توقف يمكنني في مجموعة GDB التي ستخرج عن الخطأ حتى أتمكن من عرض تتبع مكدس؟

البرنامج هو مزيج من C و C ++، التي تم تجميعها مع دول مجلس التعاون الخليجي 3.4.2.

هل كانت مفيدة؟

المحلول

ليس حقا malloc / مجانا مما يؤدي إلى الاستثناء، إنه "جديد" وهو بالتأكيد في جزء C ++ من طلبك. يبدو أنك تقدم معلمة كبيرة جدا لتخصيص "جديد".

"STD :: BAD_ALLOC" ناتج عن التعليمات البرمجية التالية على سبيل المثال:

 int * p = new int[50000000];

ماذا يقول BackTrace عند تحميل تفريغ التصادم في GDB؟ إذا لم تتمكن من إنشاء تفريغ، فيمكنك أن تسأل GDB بالتوقف عندما يتم إلقاء الاستثناء أو اشتعلتوبعد لسوء الحظ، دعم بعض إصدارات GDB فقط بناء الجملة التالي:

catch throw

والتي تتيح لك كسر التطبيق عند إلقاء أي استثناء. ومع ذلك، في مساعدتك ترى أنه يجب أن يكون من الممكن تشغيل

catch throw std::bad_alloc

في الإصدارات الأحدث.

ولا تنسى:

(GDB) مساعدة الصيد

هو مصدر جيد للحصول على معلومات مفيدة أخرى.

نصائح أخرى

من الممكن تماما أن يحدث هذا بسبب الكتابة فوق بعض الذاكرة، مما يفسد حالة نظام تخصيص الذاكرة (الذي يتم الاحتفاظ به عموما إما قبل أو بعد إرجاع كتل الذاكرة إلى التطبيق).

إذا كان لديك إمكانية (أي، فأنت على X86 Linux)، فقم بتشغيل البرنامج valgrind., ، يمكن أن تظهر لك في كثير من الأحيان حيث يحدث الفساد بالضبط.

لقد كان لدي هذا عند محاولة القراءة في ملف غير موجود ... سأحاول إنشاء مخزن مؤقت داخلي لمحتويات الملفات، ولكن نظرا لأن الملف لم يكن موجودا، فإن خلق بلدي المخزن المؤقت ثمل.

int lenth_bytes;
length_bytes = in_file.tellg();
new char [length_bytes]; // length_bytes hadn't been initialised!!!!

تذكر الأطفال، دائما تهيئة المتغيرات الخاصة بك: D والتحقق من وجود حالات صفرية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top