같은 코드인데 윈도우에선 잘 돌아가고 맥에선 에러가 나서... 한번 봐주십쇼 형님들..
환경은 윈도우에선 VS로 C++14, 맥에선 Xcode C++11로 컴파일했음
A라는 abstract class가 있고
A를 상속받은 concrete class인 B와 C가있었음
어떤 클래스 내부에서 멤버변수로
unique_ptr<A> _a; 를 선언하고
c++11에선 make_unique가 없으니까
초기화를 _a = unique_ptr<B>(new B()); 이런식으루 햇단말이야
윈도에서는 컴파일도 잘 되고 코드도 잘 돌아감
근데 맥에서는 컴파일은 되는데
자꾸 _a = unique_ptr<B>(new B()); 이 코드에서 ~A()를 호출하면서 SegFault가 뜨는거임
뭐가 문제인지도 모르겠고 윈도에선 잘 돌아가는데 왜 맥에선 안되고... 구글 검색하면서 몸을 비틀다가 어떻게 해결했냐면
A클래스의 destructor를 명시적으로 구현해주니까 해결이 됐음.. virtual ~A(){}; 요렇게...
A,B,C가 딱히 소멸자가 필요 없는 클래스라서 가상 소멸자같은것도 안만들구 있었는데... 이게 문제였던거임..
여기서 내가 추측해본 원인은 두가지인데...
1. 윈도우에선 default destructor를 만들어줬지만, 맥에선 c++버전이나 컴파일러의 차이로 default destructor를 안만들어줘서 에러가 났다.
- 근데 default destructor가 없으면 애초에 컴파일이 안되는거 아닌지... 모르겟음..
2. destructor가 virtual로 되어있지 않아서 신묘한 에러에 의해 vtable 참조에서 오류가 낫다...
- 이럴 가능성도 잇는거심??
아니면 내가모르는 다른게 있는건지.. ㅠ;
UB 아니냐
https://stackoverflow.com/a/7842277/7339320
음 나는 링크에 잇는 질문이랑은 반대상황이긴한데 정독해볼게 도움ㄱㅅㄱㅅ
이럴땐 리버싱이지
unique_ptr<a>(new B())해보셈 - dc App</a>