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

from Study/Error 2007/11/07 12:21 view 26486
아래와 같이 소켓이 생성될때 소켓을 복사해주고 소멸시킬때 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 |

_imp_ 찾을수 없다.

from Study/Error 2007/10/13 10:07 view 25057
대체로 이런에러는 import함수 없다는 말이므로 라이브러리 추가를 제대로 했는지 찾아본다.

TransprentBlt() = > msimg32.dll 을 추가해준다.
Tag |

error C2039: WSAEventSelect

from Study/Error 2007/06/25 16:01 view 22149

error C2039: 'WSAEventSelect' : is not a member of '`global namespace''

error C2065: 'WSAEventSelect' : undeclared identifier

VS 6.0 의 MFC 은 Winsock 1.1 이다. -_-..

2005의 경우는 Winsock 2.2 이상(?) 이라 WSAEventSelect 가 잘 먹혀 들어간다.

그래서 번거롭지만 이와 같은 작업을 해줘야 한다. 링커에 ws2_32.lib 추가!!

  1. StdAfx.h 파일에서 #include <afxsock.h> 대신에 #include <winsock2.h> 추가.
  2. App클래스에서 기존 소켓을 초기화 해주는 부분을 주석처리.

    //     if (!AfxSocketInit())
    //     {
    //         AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
    //         return FALSE;
    //     }

  3. 라이브러리를 초기화 해주면 자~알(?) 돌아간다.

             WSADATA wsa;
             WSAStartup( MAKEWORD(2, 2), &wsa );

Tag |

fclose, free 어이 없는 실수...

from Study/Error 2007/04/09 21:11 view 25154

FILE *fp = fopen("..", "r");

해놓고 free(fp); 를 하지 않나

int *ar = (int *)malloc(sizeof(int));

해놓고 fclose(ar); 을 하고 ...'보내지 않음'창만 계속 탓하고...

"나 바보 아냐???"

Tag |
브레이크 포인트 안 찍힐때 해결 해보기.

1. Release 모드로 컴파일하고 나서 디버깅 할려고 할때 이 에러가 발생했다.
   - 다시 바꾸고 컴파일하여 해결.

2. 프로젝트 폴더를 다른 곳으로 이동할 때 발생하였다.
   - 폴더를 이동시킨후 디버깅 포인터가 찍히지가 않았다. 각각의 프로젝트를 Debug해준후에 DLL을 다시 복사해준 후 해결.

3. 여러 프로젝트를 WorkSpace상에 있을 때 Built->Set Active Project Configuration 이 Break Point를 주고자 하는 프로젝트인지를 확인하자.
 - 브레이크를 주고자 하는 해당 프로젝트를 디버그로 바꿔주자.다시 컴파일후에 디버깅을 해보면 된다...

4. 버젼 문제로 6.0->2005 읽을 경우
 - 버젼문시 옵션을 체크해준다. 우클릭->중단점->위치(소스코드가 원래 버전과 일치하지 않아도 됨)
Tag |
http://www.winapi.co.kr에 문법에 관한 설명은 어느 정도 되어 있다.

once

pack

warning


#pragma warning (disable:4996) //2005의 deprecated에러를 무시한다.

를 추가한다면 경고자체를 띠우지 않을 수 있다. stdio.h 헤더파일에 추가 해버리자.-_-..경고짜증!!

Tag | ,