메모리 해제 관련해서 질문 있습니다
조회수 351회
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번 실행하면 절반은 실행에 문제없고 절반은 이러한 오류가 발생하네요
디버깅 하면서 조사식도 써보면서 해보았는데.. 제 눈에는 정말 문제되는 부분이 없어 보여서요 대체 뭐가 문제일까요??
댓글 입력