객체 생성후 free한 이후에도 사용이 가능하다?
머 별 이상이 없는 코드다.
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
typedef struct _car_t {
uint8_t fuel;
uint8_t speed;
} car_t;
int main() {
car_t* my_car= (car_t*)malloc(sizeof(car_t));
car_t* your_car = (car_t*)malloc(sizeof(car_t));
if (my_car == NULL) {
printf("my_car create error\\r\\n");
return 0;
}
else {
printf("my_car create ok\\r\\n");
}
if (your_car == NULL) {
printf("your_car create error\\r\\n");
return 0;
}
else {
printf("your_car create ok\\r\\n");
}
my_car->fuel = 11;
my_car->speed = 22;
your_car->fuel = 33;
your_car->speed = 44;
printf("%d, %d\\r\\n", my_car->fuel, my_car->speed);
printf("%d, %d\\r\\n", your_car->fuel, your_car->speed);
free(my_car); // (1) ★★★ 난 분명히 free를 했다? 했다고!
free(your_car);
my_car->fuel = 55; // (2) 여기서 값을 넣으면 어떻게 될까?
my_car->speed = 66;
printf("%d, %d\\r\\n", my_car->fuel, my_car->speed);
return 0;
}
위 코드에서 주석을 풀어보자.
개발자가 my_car에 값을 설정하는데, free를 뒤로 옮겨야 되는데, 깜박잊고 (2)에서 적었다 치자.
어떻게 될까?
(1) 아무런 문제가 없다. ← 이건 아니겠지, 왜냐? 위에서 free했잖아
(2) 메모리가 해제되었으므로, 뭔가 에러가 날것이다. 세그멘테이션 폴트?
(3) 잘 모르겠는데? 써지지 않을까?
답은 (3)