سؤال

يبدو أن هذه الوظيفة في SDL_Mixer تبقي الموت، وأنا لست متأكدا من السبب. هل لدى أي شخص أي أفكار؟ وفقا ل Visual Studio، يحدث الحادث الناجم عن Windows يؤدي إلى نقطة توقف في مكان ما في RealLoc ().

الرمز المعني في السؤال هو إصدار SVN من SDL_MIXER على وجه التحديد، إذا كان ذلك يحدث فرقا.

static void add_music_decoder(const char *decoder) 
{ 
  void *ptr = realloc(music_decoders, num_decoders * sizeof (const char **)); 
  if (ptr == NULL) { 
    return; /* oh well, go on without it. */ 
  } 
  music_decoders = (const char **) ptr; 
  music_decoders[num_decoders++] = decoder; 
} 

أنا أستخدم Visual Studio 2008، وموسيقى_Decoders و Num_Decoders كلاهما صحيح (Music_Decoders يحتوي على مؤشر واحد، إلى سلسلة "الموجة"، والموسيقى_Decoders. PTR هو 0x00000000، وأفضل ما يمكنني قوله، يبدو أن الحادث في RealLoc () وظيفة. هل لدى أي شخص أي فكرة كيف يمكنني التعامل مع مشكلة التعطل هذه؟ لا أمانع الاضطرار إلى القيام بدقة القرض من أجل جعل هذا العمل، إذا كان ينزل ذلك.

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

المحلول

لشيء واحد، إنه غير صالح لتخصيص مجموعة من num_decoders مؤشرات، ثم الكتابة إلى الفهرس num_decoders في هذه الصفيف. من المفترض أن تكون المرة الأولى التي تم استدعاء فيها هذه الوظيفة، خصصت 0 بايت وكتب مؤشرا لهذه النتيجة. يمكن أن يكون هذا تلف هياكل مخصص الذاكرة، مما يؤدي إلى تحطم / نقطة توقف عند realloc يسمى.

راجع للشغل، إذا أبلغت عن الخطأ، لاحظ ذلك add_chunk_decoder (في mixer.c) مكسورة بنفس الطريقة.

كنت استبدال.

void *ptr = realloc(music_decoders, num_decoders * sizeof (const char **));

مع

void *ptr = realloc(music_decoders, (num_decoders + 1) * sizeof(*music_decoders)); 

نصائح أخرى

تأكد من أن ملف SDL_MIXER.DLL وبناء برنامجك يستخدم نفس إعدادات وقت التشغيل C. من الممكن تخصيص الذاكرة باستخدام CRT واحد، و RealLoc'ed باستخدام CRT آخر.

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

Music_Decoders [Num_Decoders ++] = فك ترميز.

أنت واحد من هنا. إذا كانت Num_Decoders حجم الصفيف، فإن الفهرس الأخير هو Num_Decoders - 1. لذلك يجب أن تحل محل الخط باستخدام:

Music_Decoders [Num_Decoders-1] = فك ترميز.

وقد ترغب في زيادة عدد Num_Decoders في بداية الوظيفة، وليس في النهاية لأنك تريد أن تقطع Reallow للحجم الجديد، وليس من أجل القديم.

شيء إضافي واحد: تريد أن تضاعف الحجم مع Sizeof (Const Char *)، وليس مع النجم المزدوج.

آه، أفراح البر البرمجة. يمكن أن يتم تشغيل تحطم في RealLoc (أو malloc أو مجانا) عن طريق الكتابة الماضي حدود كتلة الذاكرة - وهذا يمكن أن يحدث في أي مكان آخر في البرنامج الخاص بك. النهج الذي استخدمته في الماضي هو بعض نكهة تصحيح malloc. صفقة. قبل القفز مع حل طرف ثالث، تحقق من المستندات لمعرفة ما إذا كان Visual Studio يوفر أي شيء على طول هذه الخطوط.

الأعطال لا يتم تشغيلها عموما عن طريق نقاط التوقف. هل تحطمها، تحطمت بسبب نقطة توقف أو تعطل أثناء التعامل مع نقطة التوقف؟

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

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