포인터 변수의 임시변수 문제.

from Study/Error 2007/11/07 12:21 view 26553
아래와 같이 소켓이 생성될때 소켓을 복사해주고 소멸시킬때 close 해줄 때 임시변수는 큰 문제가 된다.

CClientSocket::CClientSocket( SOCKET client )
: m_client( client )
{
}

CClientSocket::~CClientSocket(void)
{
    Disconnect();
}

void CClientSocket::Disconnect()
{
    if( m_client == INVALID_SOCKET )
        return;

    closesocket( m_client );
    m_client = INVALID_SOCKET;
}


vector<CClientSocket> g_Clients;

       SOCKET client = server.Accept(&clientInfo);
        assert( client != INVALID_SOCKET );

        g_Clients.push_back( client );
=> push_back 할때 임시 변수가 생성되는데 이때 생성자가 또 호출되게 된다. 그리고 사라진다.
이것이 문제다. client는 서로간의 참조관계가 되므로 같이 죽게 된다. client는 SOCKET이고 g_Clients는 CClientSocket 이므로 암시적인 형변환이라고 해야하나 이를 위해 임시변수가 생성되는것이다.

vector<SOCKET> g_Clients;
=> 그런데 SOCKET으로 한다면 죽지 않는다. 임시변수를 생성하지 않아서 그런거 같은데 -_-.. 모르겠다. 


 소멸자에서 특정 포인터를 닫을 경우엔 조심 또 조심하자. 임시변수가 생성되도 소멸자가 호출되니깐.!!
Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다