-
enable_shared_from_this를 사용했는데 예외가 발생한 경우프로그래밍/의문 2018. 9. 13. 00:22반응형class session : std::enable_shared_from_this<session>{public:session(tcp::socket socket) :socket(std::move(socket)){}//...};void do_accept(){acceptor.async_accept(socket, [&](auto error){if (error){return;}std::shared_ptr<session> newSession = std::make_shared<session>(std::move(socket));newSession->run();do_accept();});}void do_receive(){auto self = shared_from_this();socket.async_receive(asio::buffer(buffer), [self](auto error, auto bytes){if (error){return;}self->on_receive(self->buffer.data(), bytes);self->do_receive();});}
enable_shared_from_this도 상속 받고, shared_ptr로 생성했다.
그런데 shared_from_this()를 하는 부분에서 예외가 발생했다.
이유가 뭘까? 통 원인을 찾지 못했었는데
다음과 같이 public으로 상속받으니 해당 현상은 더이상 발생하지 않았다.(c++은 별도의 키워드를 지정하지 않으면 private이 된다.)
class session : public std::enable_shared_from_this<session>private으로 상속을 받는 거랑 public 상속을 받는 것의 차이 밖에 없었다.
뭐가 달랐던 건지 -_-; 접근 지정자에 따라 동작이 다른가?
비쥬얼 스튜디오 2017에서 발생했다. 버전은 15.8.4
++ 2018/10/7
이에 대해 얘기한 게 stackoverflow에도 있었다. https://stackoverflow.com/questions/39937112/stdenable-shared-from-this-public-vs-private
++ 2018/10/7
wandbox를 이용해 다른 컴파일러로도 돌려봤지만 예외가 발생했다. 테스트에 사용된 코드는 다음과 같다.
반응형'프로그래밍 > 의문' 카테고리의 다른 글
윈도우 openssl OPENSSL_Uplink(00007FFBDEE003D8,08): no OPENSSL_Applink 에러 (0) 2018.11.01 비주얼 스튜디오, utf8로 저장된 문자열 보기 (0) 2018.09.13 클라이언트에서 특정 언어권 문자열이 깨져서 보였던 이슈 (0) 2018.09.05 sql에서 정수 괄호 숫자의 의미 bigint(5) (0) 2018.07.24 논블럭 소켓으로 connect 시 EAgain만 발생하던 현상 (0) 2018.07.03