✅ 목표 (Goal)

객체 생성후 free한 이후에도 사용이 가능하다?

✅ 구조체를 new로 만든 간단한 예제

머 별 이상이 없는 코드다.

#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;
}

image.png

✅ free 한 이후에도 값을 넣어보자.

위 코드에서 주석을 풀어보자.

개발자가 my_car에 값을 설정하는데, free를 뒤로 옮겨야 되는데, 깜박잊고 (2)에서 적었다 치자.

어떻게 될까?

(1) 아무런 문제가 없다. ← 이건 아니겠지, 왜냐? 위에서 free했잖아

(2) 메모리가 해제되었으므로, 뭔가 에러가 날것이다. 세그멘테이션 폴트?

(3) 잘 모르겠는데? 써지지 않을까?

답은 (3)

✅ 왜 값이 이상없이 나올까? 안나와야 하는거 아닌가?