본문 바로가기
42seoul/circle-2

[so_long] 04. so_long 회고

by saniii 2022. 4. 27.

# 어려웠던 점 

 

1. 크기가 다 똑같은 이미지를 구하기가 어려웠다. 

과제에서 알려주는 사이트로 들어가면 16, 6, 32 제각각이다. 그래서 원하는 이미지만 골라서 넣고자 할 때도 전부 같은 크기로 맞추기 어려웠다. 

제발 고생하지 말고 이거 써서 크기 맞추세여!!!!!!!

 https://www.resizepixel.com/ko

 

 

 

 

2. 구조체안에 구조체를 두었다.

좀 갈끔하게, 변수를 덕지덕지 넣지 않고 분류되듯이 하려고 구조체안에 캐릭터에 대한 정보를 담는 구조체, 맵에 대한 정보를 담는 구조체, 이미지에 대한 정보를 담는 구조체를 넣었는데 

typedef struct s_map
{
	int	row;
	int	col;
}				t_map;

typedef struct s_img
{
	void	*mermaid;
	void	*shoes;
	void	*bubble;
	void	*wall;
	void	*ocean;
}				t_img;

typedef struct s_mermaid
{
	int	walk;
	int	collect;
}				t_mermaid;

typedef struct s_game
{
	void		*mlx;
	void		*win;
	char		*mapl;
	int			collect;
	t_img		img;
	t_map		map;
	t_mermaid	mermaid;
}				t_game;

이렇게 하면 메모리할당, 해제를 어떻게 해야할지 혼란이 왔다. 

그냥 game을 메모리 할당하면 img, map, mermaid는 메모리할당을 따로 더 안해줘도 되는지 헷갈렸다. 

 

구조체안의 구조체를 검색한 결과 

https://dojang.io/mod/page/view.php?id=463

 

구조체1 안에 구조체2를 포인터로 선언했을 때는 구조체1과 2모두 메모리를 할당해야한다. 바깥 구조체1부터 메모리할당하고 안의 구조체2를 할당하면 된다. 해제할 때는 안쪽부터 2를 해제하고 1을 해제한다. 

 

만일 나와 같이 포인터가 아니라 그냥 구조체멤버를 선언하면 구조체2는 메모리할당을 할 필요가 없다. 

내가 헷갈렸던 이유는 구조체 안에 선언된 구조체 t_img가 포인터 변수들로 이루어져 있어서 어떻해야하나 고민했는데 어차피 사용하는게 인스턴스를 만들어서 그걸 가리키도록 만들거기 때문에 굳이 그럴 필요가 없다고 생각했고 실제로도 메모리 누수 안났다. 

 

 

아- 근데 궁금한 점은 이 프로그램 정상종료할 때 이미지 인스턴스는 따로 해제 안하는데 (mlx_destroy_image 같은) 왜 메모리 누수 안나지?

 

3. mlx를 사용하는 방법에 대해서 정확히 이해하기가 힘들었다. 

https://github.com/terry-yes/mlx_example  여기 예시를 보면서 이해했다. 

 

 

 

4. bill어먹을 Makefile 

 

우린 언제 친해질 수 있을까? ^^

 

 

 

5. mlx destroy 메모리 누수

 

map에 대한 에러로 인해 종료할 때 

mlx_new_window를 하기 전에 에러 종료 하도록 한 항목은 그냥 사용했던 문자열 포인터랑 mlx포인터, t_game포인터만 해제하면 됬는데 

한가지 항목은 mlx_new_window를 하고 mlx_put_image_to_window를 하는 도중에 에러에 걸리면 에러종료하도록 했다. 

어쨌든 mlx_new_window로 win 인스턴스 포인터를 만들었기 때문에 문자열 포인터랑 t_game 포인터해제하고 mlx_destroy_window를 하도록 했는데 계속 1leaks씩 났다. 이유를 모르겠어서 결국에는 그냥 로직을 좀 바꿔서 다른 에러들처럼 mlx_new_window를 하기 전에 에러처리를 하도록 고쳤다. 

아ㅏㅏㅏㅏㅏ근데 지금 쓰면서 보니까 mlx_destroy_window는 win인스턴스를 해제하는거니까 mlx를 따로 해제했으면 해결됬을 것 같다. 왜 그때는 mlx를 따로 해제할 생각을 못했지?!?!?!?!??!

 

 

 

 

# 아쉬운 점

 

1. .ber에 대한 파싱

.ber에 대한 

 

2. 쓸데없이 중복으로 include된 헤더 

 

 

 

 

# 뿌듯한 점

 

1. 이제 포인터로 인한 메모리 누수 진짜 잘 잡을 수 있을 것 같다. ^^

 

2. 간단한 2D게임을 만들 수 있다. 

 

3. libft에 있는 기본 함수들을 내가 원하는 기능을 추가하여 쓸 수 있다. 

 

 

 

 

 

 

 

댓글