default 파괴자

WanJu Kim·2023년 6월 8일
0

2D Project

목록 보기
9/13

☆ 성장 신호
1. vector를 멤버로 가지는 구조체 지역 변수가 없어질 때 에러 나옴. 만약 vector 멤버에 데이터가 없다면 에러 발생하지 않음. clear(), shirnk_to_fit() 메서드를 통해 데이터를 지워도 에러가 발생하지 않음.
2. 'vector를 멤버로 가지는 구조체'를 value로 가지는 unordered_map 변수가 parameter로 전달되지 않음. 마찬가지로 vector 멤버에 데이터가 없다면 에러 발생하지 않음.

★ 성장하기 위해.
0. 아무것도 치지 않고 생각하기 → 아무 일도 일어나지 않음을 확인.
1. vector 멤버 변수를 → 가짜 원인 확인. 근본적인 원인은 아니었음을 확인.
2. 주소를 확인. → 원인이 아님을 확인.
3. 에러가 발생하는 해당 클래스 외의 클래스를 주석처리 하면서 확인 → 원인 발견.


성장 과정


A.cpp의 159줄에서 161라인으로 넘어갈 때

이런 성장 신호 발견. 검색해도? 별 거 안 뜬다.
중괄호가 끝나기 전에 무슨 일이 일어나나? 보니까

저기 두 지역 변수가 사라지는 것 이외에는 일어나는 일이 없다. 근데 ext는 뭐 확인 안해 봤고,, 왜 data를 건드렸었지?

위에 저런 코드가 있었는데 저거 주석 처리하고 실행하니까 되더라. SpriteData 구조체의 vector 멤버 변수에 값을 넣는 코드였다. 그래서 자연스럽게 vector 멤버가 문제라고 생각했다. SpriteData 구조체는 다음과 같다.

vector 멤버를 가진다. 어쨌든 vector 멤버가 문제라고 생각되니, 'SpriteData 지역변수도 끝날 때 vector 멤버를 안 가지면 될 것 아니냐?'라고 생각했고, clear()와 shrink_to_fit() 메서드를 쓰면서 자연스럽게 통과했다.

그러나 또 다른 성장 신호가 발생했다.

unordered_map 멤버 변수에 아까 그 vector 멤버를 가진 구조체를 보관하고 있었는데, 이걸 auto 연산자 통해서 원본으로 받아서 함수에 call by reference로 전달하려고 했는데

데이터가 잘 들어온다?

사실 원래 데이터로 쓰레기 값이 들어왔었는데, 지금은 갑자기 잘 들어온다. 이상... 어쨌든 (문제가 생겼다라고 가정하고) 여기서도 저 vector에서 문제가 생겼으니, 난 더더욱 vector 멤버 변수 문제라고 생각했다. (사실 이것도 이상... 지역 변수가 사라지는 게 왜 문제임?) 그래서 구조체와 vector 멤버의 주소도 비교해보고 온갖 쌩쇼를 했다.

그러나 해결 방법은 따로 있었다.

이러한 방법이 통하지 않아서, 그냥 이 클래스 외 다른 코드들을 모두 주석 처리하고, 에러가 나올 때까지 하나씩 주석을 풀었다. 그렇게 발견한 코드는,

A와는 멀리 떨어진 D클래스의 default 파괴자이다. 저 키워드를 없애주고 일반 파괴자를 적었더니 된다.
???????????????????????????

왜 A 클래스의 에러를 D 클래스에서 찾아야 하는가?
왜 default 파괴자가 문제가 되는가?
심지어 도중에 저 파괴자 코드는 거쳐가지도 않는다.

이 이유는 모르겠다.

추가로 unordered_map::insert 메서드도 사용이 안됐는데 이거 해결하니까 된 것 같음...

나는 앞으로 default 키워드를 사용 할 수 있을까?
진짜 원인

profile
Question, Think, Select

0개의 댓글