메모리 해제 관련해서 질문 있습니다

조회수 640회
typedef struct {
    int coefficient;
    int exponent;
}Term;

void print_term(Term* term, int size) {
    for (int i = 0; i < size; i++) {
        if (term[i].coefficient > 0 && i != 0)
            printf("+");
        if (term[i].coefficient == 1) {
            if (term[i].exponent == 1)
                printf("X");
            else if (term[i].exponent == 0)
                printf("1");
            else
                printf("X^%d", term[i].exponent);
        }
        else if (term[i].coefficient == -1) {
            if (term[i].exponent == 1)
                printf("-X");
            else if (term[i].exponent == 0)
                printf("-1");
            else
                printf("-X^%d", term[i].exponent);
        }
        else {
            if (term[i].exponent == 1)
                printf("%dX", term[i].coefficient);
            else if (term[i].exponent == 0)
                printf("%d", term[i].coefficient);
            else
                printf("%dX^%d", term[i].coefficient, term[i].exponent);
        }
    }
}

void multi_term(Term** term, int* _size) {
    int size = _size[0] * _size[1];
    int index = 0;
    int** temp_list = NULL;
    temp_list = (int**)malloc(sizeof(int) * size);
    int** add_list = NULL;
    add_list = (int**)malloc(sizeof(int) * size);
    for (int i = 0; i < size; i++) {
        add_list[i] = (int*)malloc(sizeof(int) * 2);
        temp_list[i] = (int*)malloc(sizeof(int) * 2);
    }

    for (int i = 0; i < _size[0]; i++) {
        for (int k = 0; k < _size[1]; k++) {
            temp_list[index][0] = term[0][i].coefficient * term[1][k].coefficient;
            temp_list[index][1] = term[0][i].exponent + term[1][k].exponent;
            index++;
        }
    }

    for (int i = 0; i < index; i++) {
        printf("\n계수 : %d 지수 : %d", temp_list[i][0], temp_list[i][1]);
    }

    index = 0;
    for (int i = 0; i < size; i++) {
        add_list[index][0] = temp_list[i][0];
        for (int k = i + 1; k < size; k++) {
            if (temp_list[i][1] == temp_list[k][1]) {
                add_list[index][0] += temp_list[k][0];
                i++;
            }
        }
        add_list[index][1] = temp_list[i][1];
        index++;
    }

    term[2] = (Term*)malloc(sizeof(Term) * index);
    for (int i = 0; i < index; i++) {
        term[2][i].coefficient = add_list[i][0];
        term[2][i].exponent = add_list[i][1];
    }

    printf("\n두 다항식의 곱 : ");
    print_term(term[2], index);


    /*for (int i = 0; i < size; i++) {
        free(add_list[i]);
        free(temp_list[i]);
    }

    free(add_list);
    free(temp_list);*/

}

int main() {

    char filename[50];
    FILE* fp;
    int input_data;

    printf("입력 파일 이름? ");
    gets_s(filename);

    fp = fopen(filename, "r");
    if (fp == NULL) { printf("파일이 존재하지 않습니다"); return 0; }


    int size[2];
    int read_data;
    int coeff_or_expon[2];
    Term** term = NULL;
    term = (Term**)malloc(sizeof(Term) * 3);
    for (int i = 0; i < 2; i++) {
        int count = 0, term_count = 0;
        fscanf(fp, "%d", &input_data);
        term[i] = (Term*)malloc(sizeof(Term) * input_data);
        size[i] = input_data;
        while (!feof(fp))
        {
            count++;
            fscanf(fp, "%d", &read_data);
            if (count % 2 == 1)
                coeff_or_expon[0] = read_data;
            else {
                coeff_or_expon[1] = read_data;
                term[i][term_count].coefficient = coeff_or_expon[0];
                term[i][term_count].exponent = coeff_or_expon[1];
                term_count++;
                if (term_count == input_data) break;
            }
        }
    }

    printf("첫 번째 다항식 : ");
    print_term(term[0], size[0]);
    printf("\n두 번째 다항식 : ");
    print_term(term[1], size[1]);
    printf("\n다항식의 곱 : ");
    multi_term(term, size);


    /*free(term[0]);
    free(term[1]);
    free(term[2]);
    free(term);*/


    return 0;
}

구현은 다 해놓았는데.. 주석 해놓은 free부분을 해제하면 자꾸 중단점 명령이 실행되었다면서 debug.heap의

extern "C" int __cdecl _CrtIsValidHeapPointer(void const* const block)
{
    if (!block)
        return FALSE;

    return HeapValidate(__acrt_heap, 0, header_from_block(block));
}

이 부분으로 이동해요 구글링 해보니까 이미 해제한 부분을 또 해제하면 이러한 오류가 발생한다던데 10번 실행하면 절반은 실행에 문제없고 절반은 이러한 오류가 발생하네요

디버깅 하면서 조사식도 써보면서 해보았는데.. 제 눈에는 정말 문제되는 부분이 없어 보여서요 대체 뭐가 문제일까요??

1 답변

  • 올려주신 정보가 코드밖에 없어서 정확한 답변을 줄수 없습니다만, 아래의 코드에서 파일 안의 input_data가 0이거나 음수일 경우 문제가 될 수 있습니다. malloc 전에 출력해보시거나 예외 처리 해보세요. 0인 경우에 현재와 같은 일이 발생될 수 있습니다.

    fscanf(fp, "%d", &input_data);
    term[i] = (Term*)malloc(sizeof(Term) * input_data);
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)