Ошибка двойного освобождения или искажения внутри этой функции?

Ниже моя функция. Он запускается правильно один раз, затем, когда он вызывается во второй раз, он вызывает ошибку, сообщающую мне "двойное освобождение или повреждение". Я попытался добавить +1 в malloc(), как предлагали другие посты, хотя я не храню строки с нулевым символом в конце, а массивы целых чисел. Это не помогло.

Я очень смущен в этом пункте. Я не понимаю, почему в конце функции указатель, который был свободен () "не выходит из области видимости, или, если это так, то как его можно считать двойным освобождением, когда я malloc()" d после освобождения () в последний раз, когда он был использован.

int getCount(int number) {

    int totalUniqueDigits = 0;

    bool* allDigits = (bool*)malloc(10 * sizeof(bool));

    do {
        int currentDigit = number % 10;
        number /= 10;
        allDigits[currentDigit] = true;
    } while (number > 0);

    for (int i = 0; i < 10; i += 2) {   
        if (allDigits[i] == true) {     
            totalUniqueDigits++;        
        }
    }

    free(allDigits);    /*This is where the problem is, but only the second time the function is called. */ 
    allDigits = NULL;

    return totalUniqueDigits; 
}

3 ответа

Решение

Если number отрицательно, то

currentDigit = number % 10;

будет также отрицательным (или ноль, если делится на 10). Это несколько неудобное (IMO) определение оператора модуля.

Если currentDigit отрицательно, то

allDigits[currentDigit] = true;

напишу вне границ. На большинстве систем запись в allDigits[-1] перезапишет информацию, используемую для управления памятью. Это может напрямую не привести к краху вашей программы, но с использованием malloc позже может иметь такой эффект.

Решение, конечно, заключается в том, чтобы использовать abs или добавить 10 в currentDigit если это отрицательно.

Индекс массива не проверялся на наличие отрицательных значений. Дело закрыто. Спасибо, Крис.

Размещенный вами код работает без ошибок для всех натуральных чисел. Это код C++, а не код C. Если это код на C, вам нужно показать объявление "bool", "true" и "false", в противном случае в предоставленной функции нет ошибки, в случае выполнения.

Вот полная программа на С ++, чтобы проверить это.

#include <iostream>
using namespace std;


int getTotalUniqueEvenDigitCount(int number) {

    int totalUniqueDigits = 0;

    bool* allDigits = (bool*)malloc(10 * sizeof(bool));

    do {
        int currentDigit = number % 10;
        number /= 10;
        allDigits[currentDigit] = true;
    } while (number > 0);

    for (int i = 0; i < 10; i += 2) {   
        if (allDigits[i] == true) {     
            totalUniqueDigits++;        
        }
    }

    free(allDigits);    /*This is where the problem is, but only the second time the function is called. */ 
    allDigits = NULL;

    return totalUniqueDigits; 
}


int main(int argc, char ** argv){
  cout << getTotalUniqueEvenDigitCount(stoi(argv[1]));
  return 0;
}

Проверьте это как

$<progname> number
Другие вопросы по тегам