내가 모 c++ 교재의 소스코드를 따라 치다가 위의 코드와 같은 상황에서 ~Temp()에서 클래스 맴버인 t를 할당해제 하지 않는 것을 발견하고

저자가 병신인가? 이딴 식으로 코드 짜다가는 메모리 누수가 일어나는건가? 아니면 컴파일러가 이런건 알아서 해주나?(아닐텐데..) 이런 생각을 하면서 할당해제를 해줬음. 그랬더니 Segfault가 발생하더라고.


정확한 문제는 교재의 코드 중 함수로 그냥 클래스 객체를 넘겨주는 부분에서 내부의 객체가 증발해버리는 현상이 발생한 것임.


세 가지 함수를 만들어서 확인해 보면, 포인터나 참조자 형태로 클래스를 넘겨 주는 것은 상관이 없지만,

그냥 클래스 객체를 인자로 받는 temp_fn이 끝날 때 t 객체에서 소멸자를 호출하고 다시 main()에서 한 번 t객체의 소멸자를 호출함

그래서 double free 에러가 발생하게 되는데. rust였다면 이런 일이 없었을텐데 라고 생각하면서 원인에 대해서 다시 생각을 하기 시작함.


주소를 찍어보니 주소가 다르네? 그렇다는 것은 아마 함수 호출 시 copy constructor가 호출되고

클래스 객체를 복사하면서 내부 주소까지 싹 복사를 하기 때문에 문제가 발생했을 것이라고 추측



빠르게 TempTemp 객체도 새로 할당하는 복사 생성자를 작성해 보니까.


예상대로 문제 없이 작동하는 것을 알 수 있었음.


결론:

1. C에서의 구조체와 마찬가지로 C++ class도 그냥 함수에 넘겨 주면 복사가 일어난다는 사실을 알았음. 따라서 클래스 내에 동적할당 된 데이터가 있으면

copy constructor에서 이를 처리 해줘야 한다는 사실을 알았음.


2. F 교수님 네트워크 책은 정말 띵저라서 아주 잘 봤다만 잘 하는 것만 하시지 C++책 까지 욕심내서 ㅄ같은 예제코드 넣어 놓는건 좀 아니라고 생각함.