باستخدام Malloc و Free في C/C ++ والحصول على فساد كومة الأخطاء التي تم اكتشافها

StackOverflow https://stackoverflow.com/questions/4288039

سؤال

أواجه مشكلة عندما يتم تشغيل الحرية (الموضع).

void printTree(nodeT node, int hieght)
{
    int *position;
    position = (int*)malloc(hieght * sizeof(int*));
    for (int i = 0; i <= hieght; i++)
    {
        position[i] = 0;
    }
    BOOLEAN DONE = FALSE;
    while (DONE == FALSE)
    {
        printMoveDown(&node, position);
        printLEAFNode(&node, position);
        DONE = printMoveUp(&node, position);
        printSingleKey(&node, position);
    } 
    free(position);
    position = NULL;
}

رسالة الخطأ الكاملة التي أحصل عليها من VS2010 هي الكشف عن فساد الكومة: بعد الكتلة العادية (#64) على 0x00031390. اكتشف CRT أن التطبيق كتب إلى الذاكرة بعد نهاية الكومة.

يقول مصحح الأخطاء إن المشكلة تحدث أثناء وجودها في: dbghap.c

extern "C" void __cdecl _free_dbg_nolock
line 1376:  if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize))
                if (pHead->szFileName) {..}
                else { this is where the program stops }

حاولت إعداد نفس الموقف مع حدوث أشياء أقل لمعرفة ما إذا كان بإمكاني تضييق المشكلة.

void function (int y)
{
    int *x;
    x = (int*)malloc(y * sizeof(int*));
    free(x);
    x = NULL;
}

هذا هو نفس الشيء كما هو مذكور أعلاه بدون حلقة وأثناء حلقة. هذا يعمل. إزالة الحلقة هو ما جعلها تعمل. أنا لا أعرف لماذا. نظرت إلى ما كان عليه CRT ولكن كان كل مفاهيم جديدة جدًا بالنسبة لي وأفترض أنه يمكنني حل هذه المشكلة دون معرفة هذه CRTs.

تقوم الحلقة الخاصة بتعيين قيم للذاكرة المخصصة للموضع ، أبعد من ذلك لا يمكنني التفكير في سبب حدوث مشكلة .... في الواقع الآن أفكر في الأمر. لقد غيرت الحلقة لتكون ارتفاع + 1 والتي حددت المشكلة.

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

المحلول

يجب أن يكون:

position = malloc(hieght * sizeof(int));

أو:

position = malloc(hieght * sizeof *position);

إنه سلوك غير محدد بالطريقة التي لديك. ربما تكون محظوظًا لأن int و int* هي نفس الحجم.

والطريقة الصحيحة النموذجية لكتابة الحلقة هي:

for (int i = 0; i < hieght; i++)
{
    position[i] = 0;
}

يمكنك أيضًا استخدام Calloc هنا:

position = calloc(hieght, sizeof *position);

وسيتم تصاريح الذاكرة بالنسبة لك ، لذلك لا تضطر إلى حلقة.

أيضا ، إذا كان هذا هو حقا ج ، فإن الممثلين لا لزوم لها.

نصائح أخرى

أعتقد أن المشكلة في الحلقة هي <= التي يجب أن تكون <. وبالتالي فإن الحلقة تدور حول مرة واحدة أكثر من اللازم وتفسد العنصر التالي على الكومة!

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