출처 : http://leechen.wzsoft.com/ 사이트의 <이준곤> 님이 쓰신 글

디바이스가 바뀔때, 렌더 상태(render-state)나 텍스쳐 스테이지 상태(texture-stage-state), 또는 스트림 소스(stream-source)등이 얼만큼의 비용이 드는지 알고 싶어 할 것이다. 또한 최적화 루틴으로 과부하가 걸리는 상태를 피하고 싶을 것이다. 이럴 때 정확한 함수의 실행 클럭 수치를 파악하고 있다면 좀더 최적화된 게임 개발이 될 것이라 생각된다.

API Call Avg # of Cycles
SetVertexDeclaration 6500 - 11250
SetFVF 6400 - 11200
SetVertexShader 3000 - 12100
SetPixelShader 6300 - 7000
SPECULARENABLE 1900 - 11200
SetRenderTarget 6000 - 6250
SetPixelShaderConstant (1 Constant) 1500 - 9000
NORMALIZENORMALS 2200 - 8100
LightEnable 1300 - 9000
SetStreamSource 3700 - 5800
LIGHTING 1700 - 7500
DIFFUSEMATERIALSOURCE 900 - 8300
AMBIENTMATERIALSOURCE 900 - 8200
COLORVERTEX 800 - 7800
SetLight 2200 - 5100
SetTransform 3200 - 3750
SetIndices 900 - 5600
AMBIENT 1150 - 4800
SetTexture 2500 - 3100
SPECULARMATERIALSOURCE 900 - 4600
EMISSIVEMATERIALSOURCE 900 - 4500
SetMaterial 1000 - 3700
ZENABLE 700 - 3900
WRAP0 1600 - 2700
MINFILTER 1700 - 2500
MAGFILTER 1700 - 2400
SetVertexShaderConstant (1 Constant) 1000 - 2700
COLOROP 1500 - 2100
COLORARG2 1300 - 2000
COLORARG1 1300 - 1980
CULLMODE 500 - 2570
CLIPPING 500 - 2550
DrawIndexedPrimitive 1200 - 1400
ADDRESSV 1090 - 1500
ADDRESSU 1070 - 1500
DrawPrimitive 1050 - 1150
SRGBTEXTURE 150 - 1500
STENCILMASK 570 - 700
STENCILZFAIL 500 - 800
STENCILREF 550 - 700
ALPHABLENDENABLE 550 - 700
STENCILFUNC 560 - 680
STENCILWRITEMASK 520 - 700
STENCILFAIL 500 - 750
ZFUNC 510 - 700
ZWRITEENABLE 520 - 680
STENCILENABLE 540 - 650
STENCILPASS 560 - 630
SRCBLEND 500 - 685
TWOSIDEDSTENCILMODE 450 - 590
ALPHATESTENABLE 470 - 525
ALPHAREF 460 - 530
ALPHAFUNC 450 - 540
DESTBLEND 475 - 510
COLORWRITEENABLE 465 - 515
CCW_STENCILFAIL 340 - 560
CCW_STENCILPASS 340 - 545
CCW_STENCILZFAIL 330 - 495
SCISSORTESTENABLE 375 - 440
CCW_STENCILFUNC 250 - 480
SetScissorRect 150 - 340


참고 싸이트 : http://www.circlesoft.org/pages.php?pg=kbasepage&id=12&updateID=18


Posted by 노을삼킨별
,

출처 :  http://blog.naver.com/neojzs.do

1. 컴파일러의 최적화 옵션에서 '속도 최적화'대신에 '코드 크기 최소화' 설정이 캐쉬 성능을 향상시켜 좀 더 빠른 코드를 얻을 수 있게 한다.

2. 각 CPU(인텔의 SSE, SSE2 / AMD의 3DNow )의 SIMD 를 활용하는 함수를 만들어 사용해라

3. 가능한 나눗셈 연산을 최소화해라.
예)
<수정전>
b = a / m;  
c = d / m;

<수정후>
m = 1 / m;
b = a * m;
c = d * m;

4. switch문을 쓸 때 연속된 수치를 사용해라. 그러면 VC가 컴파일할 때 테이블형태로 만들어 조건분기보다 빠르게 사용된다.
예)
case 0 :  
case 1 :
case 2 :

예2)
case 10 :
case 9 :
case 8 :

잘못된 예)
case 2 :
case 4 :
case 3 :

5. 펜티움 Pro이상에서는 CMOVxx / FCMOVxx 같은 조건적 이동 명령을 이용할 수 있다. 간단한 내용은 IF문보다 다음과 같은 코드를 사용해라.

A == 0 ? choice1 : choice2;

6. 자주 사용하는 자료 구조는 32바이트의 배수로 정렬시켜 사용해라. 컴퓨터의 캐쉬라인을 최적으로 사용할 수 있기 때문에 전체 성능이 크게 좋아진다. 펜티움 4는 L1의 캐시라인크기가 64바이트이고 L2가 128바이트, AMD 애슬론은 L1, L2가 64바이트이다. 이 기법을 패딩(Padding)이라고 한다.

7. sin, cos, tan, exp, arcsin등의 수학 함수는 가급적 피하고 룩업 테이블이나 비슷한 형태로 간략하게 함수로 만들어서 사용해라.

8. 부동 소수점은 가급적 double보다 float를 사용해라. double의 나눗셈은 39사이클이 걸리지만 float은 19사이클만 걸린다. (단, 2의 제곱수로 나누면 8사이클정도만 걸린다) 그리고 float형 일때는 반드시 뒤에 f를 붙여라. float a = 1.0; 보다 float a = 1.0f; 가 더 빠르다.

9. 순서에 상관이 없다면 후연산자 보다 선연산자를 사용해라. a++; 보다 ++a;를 사용하라는 것이다.

10. 가능하다면 const를 사용해라. 컴파일러가 좀더 최적화가 잘 해줄 가능성이 생기게 된다.

11. 메모리 관리 함수는 따로 만들어서 사용하는 것이 좋다. malloc과 free는 느리기 때문에 시작할 때 메모리를 많이 잡은 뒤 관리해서 사용하는 것이 좋다. 퀘이크1 이 좋은 예이다.


Posted by 노을삼킨별
,

출처 : http://leechen.wzsoft.com/ 이 사이트의 <이하늘> 님이 쓰신 글

자료 출처 : 뽈따구님 홈피
작 성 자 : 뽈따구님

안녕하세요 볼따구 입니다.

풀화면에서 가끔 Dialog를 뛰어야 하는 경우가 생깁니다.
9.0 이상 버젼에서는 DX차원에서 지원을 합니다.

하지만, 몇가지 제안이 있기 때문에 실제로 적용시키는걸 잘 모르는분들이 있어서
한번 올려봅니다. ;;;

D3D디바이스를 생성할때
D3DPRESENT_PARAMETERS 인자중에 몇가지를 셋팅을 해야 합니다.
[1] SwapEffect = D3DSWAPEFFECT_DISCARD;
[2] BackBufferFormat = D3DFMT_X8R8G8B8; 또는 D3DFMT_X1R5G5B5, D3DFMT_R5G6B5
[3] Flags        |= D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

위에 옵션을 셋팅해서 디바이스를 생성한후에
D3DDevice->SetDialogBoxMode( TRUE );  이렇게 디바이스에 DialogBox를 사용한다고 해 놓으면
풀화면에서도 잘나오는걸 확인할수가 있을겁니다.

즐프~


'게임 개발' 카테고리의 다른 글

CVS대체 SVN + Eclipse 통합  (0) 2005.11.02
코드 최적화에 대한 Tip  (0) 2005.10.28
IME에 관한 간단한 글  (0) 2005.10.26
메모리 누수 잡기  (0) 2005.10.25
ftp 서버 만들기 2장  (0) 2005.09.13
Posted by 노을삼킨별
,

출처 : http://leechen.wzsoft.com/ 이 사이트의 <이하늘> 님이 쓰신 글

IME(한영전환)

영문 모드로 바꾸기

HIMC  hIMC;
DWORD  dwConversion;
DWORD  dwSentence;

if( !(hIMC = ImmGetContext( GetActiveWindow() ) ) )
   return;
ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence);
if(dwConversion & IME_CMODE_HANGEUL) // 한글모드면...
   dwConversion -= IME_CMODE_HANGEUL;

ImmSetConversionStatus( hIMC, IME_CMODE_ALPHANUMERIC, IME_SMODE_NONE);
ImmReleaseContext( GetActiveWindow(), hIMC );


한글 모드로 바꾸기 :
HIMC  hIMC;
DWORD  dwConversion;
DWORD  dwSentence;

if( !(hIMC = ImmGetContext( GetActiveWindow() ) ) )
   return;
ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence);

ImmSetConversionStatus( hIMC, dwConversion | IME_CMODE_HANGEUL, IME_SMODE_NONE);
ImmReleaseContext( GetActiveWindow(), hIMC );


한영 토클시키기
HIMC  hIMC;
DWORD  dwConversion;
DWORD  dwSentence;

if( !(hIMC = ImmGetContext( GetActiveWindow() ) ) )
   return;

ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence);
if(dwConversion & IME_CMODE_HANGEUL) //한글 모드면
   dwConversion -= IME_CMODE_HANGEUL;
else
   dwConversion = dwConversion | IME_CMODE_HANGEUL;

ImmSetConversionStatus( hIMC, dwConversion, dwSentence);
ImmReleaseContext( GetActiveWindow(), hIMC );


반각문자 입력모드
HIMC  hIMC;
DWORD  dwConversion;
DWORD  dwSentence;

if( !(hIMC = ImmGetContext( GetActiveWindow() ) ) )
   return;

ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence);
if(dwConversion & IME_CMODE_FULLSHAPE) //전각 모드면
   dwConversion -= IME_CMODE_FULLSHAPE;

ImmSetConversionStatus( hIMC, dwConversion, dwSentence);
ImmReleaseContext( GetActiveWindow(), hIMC );


전각문자 입력모드
HIMC  hIMC;
DWORD  dwConversion;
DWORD  dwSentence;

if( !(hIMC = ImmGetContext( GetActiveWindow() ) ) )
   return;

ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence);

ImmSetConversionStatus( hIMC, dwConversion | IME_CMODE_FULLSHAPE, dwSentence);
ImmReleaseContext( GetActiveWindow(), hIMC );


'게임 개발' 카테고리의 다른 글

코드 최적화에 대한 Tip  (0) 2005.10.28
풀화면에서 Dialog띠우기 팁 입니다. (DX9.0)  (0) 2005.10.27
메모리 누수 잡기  (0) 2005.10.25
ftp 서버 만들기 2장  (0) 2005.09.13
C++사이트 링크  (0) 2004.07.30
Posted by 노을삼킨별
,

자료출처 : http://blog.naver.com/leeyc98/100014091364

*메모리 누수 잡기
-----------------------------------------------------------------------------------
#include <crtdbg.h> 를 추가한다.
코딩의 마지막 부분에
_CrtDumpMemoryLeaks(); 를 써준다.

F5를 눌러 컴파일을 하면 메모리 누수가 일어났을경우
메모리 누수가 일어난 번지(??)를 알려준다.

누수가 일어난 부분을 확인한 후
_CrtSetBreakAlloc(번지); 를 처음 부분에 써주고 F5를 눌러 컴파일 하면 그 부분을 찾아간다.
-----------------------------------------------------------------------------------

*NULL값을 확인하는 방법?
-----------------------------------------------------------------------------------
#include <assert.h>를 추가한다.
확인하고자 하는 변수(?)를 assert(변수); 이렇게 써준다 .
변수가 NULL값일경우 화면에 에러메시지를 표시해준다.
-----------------------------------------------------------------------------------

*디버깅창에 문자열을 출력하는 방법
-----------------------------------------------------------------------------------
#include <windows.h>를 추가한다.
OutputDebugString(문자열);
문자열이 디버깅창에 표시가 된다. -ㅁ-;

'게임 개발' 카테고리의 다른 글

풀화면에서 Dialog띠우기 팁 입니다. (DX9.0)  (0) 2005.10.27
IME에 관한 간단한 글  (0) 2005.10.26
ftp 서버 만들기 2장  (0) 2005.09.13
C++사이트 링크  (0) 2004.07.30
소켓 프로그래밍 기초  (0) 2004.07.22
Posted by 노을삼킨별
,

출처 : http://blog.naver.com/soha1213/40017389524

FTP 서버 설치 방법

FTP 서버를 운영하기 위해 IIS를 설치하는 방법은 이전 글에서 소개한 IIS 설치 과정과 동일하다. 이번 글에서는 FTP 서버를 운영하기 위해 필요한 최소한의 구성 요소만을 소개하고자 한다.


Windows 2000이나 Windows XP 모두 FTP 서버를 운영하기 위한 IIS 구성 요소는 동일하다. 필요한 구성 요소는 아래 캡쳐된 사진과 같다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->
 


Windows 2000의 경우. 공용 파일, 인터넷 정보 서비스 스냅인, File Transfer Protocol(FTP) 서버에만 체크를 하면 FTP 서버를 운영할 수 있다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->
 

Windows XP 역시 Windows 2000과 마찬가지로, 공용 파일, 인터넷 정보 서비스 스냅인, File Transfer Protocol(FTP) 서버에만 체크를 하면 FTP 서버를 운영할 수 있다.


위 캡쳐 사진까지의 진행 과정이나, 이후 설치 과정에 대해 궁금한 독자는 지난 article을 참조하기 바란다.


FTP 서버의 기본 설정을 위한 MMC 콘솔 열기

IIS의 설정은 MMC(Microsoft Management Console)을 통해 변경할 수 있다. MMC를 사용하는 다른 서비스와 마찬가지로 IIS 역시 키보드를 통한 콘솔 작업이 아니라 마우스를 통해 작업을 진행할 수 있기 때문에 초보자도 쉽게 설정을 변경할 수 있다.


일단 서버의 기본 설정을 변경하기 위해서는 MMC를 통해 IIS의 설정 스크립트를 동작시켜야 한다. 이 과정은 다음 캡쳐 사진과 같은 과정을 통해 실행시킬 수 있다.


Windows 2000의 경우

1. 제어판에서 관리 도구를 선택한다.

 


2. 관리 도구에서 인터넷 서비스 관리자를 실행시킨다.

 


3. 인터넷 정보 서비스라는 윈도우가 등장하는데, 이 윈도우가 IIS의 설정을 변경할 수 있는 MMC 윈도우다.

 <!-- badtag filtered -->


FTP 서버의 기본 설정을 위한 MMC 콘솔 열기 (2)

 

Windows XP의 경우

1. 제어판에서 성능 및 유지 관리를 선택한다. (만약 제어판 설정이 '클래식 보기'일 경우는 2번의 두 번째 캡쳐 사진을 참조)

 <!-- badtag filtered --> 

2. 성능 및 유지 관리 윈도우에서 관리 도구를 선택한다.

 <!-- badtag filtered --> 

만약 제어판이 '클래식 보기'로 설정되어 있을 경우에는 관리 도구를 직접 선택할 수 있다.

 <!-- badtag filtered --> 

3. 관리 도구 윈도우에서 인터넷 정보 서비스를 실행시킨다.

 <!-- badtag filtered --> 

4. 인터넷 정보 서비스라는 윈도우가 등장하는데, 이 윈도우가 IIS의 설정을 변경할 수 있는 MMC 윈도우다.

 <!-- badtag filtered -->


FTP 서버의 기본 설정 변경 (1)

 

FTP 서버의 기본 설정을 변경해보도록 하겠다.

우선 MMC 윈도우에서 자신의 컴퓨터 이름 좌측에 있는 + 마크를 클릭하거나 컴퓨터 이름을 더블 클릭하면 컴퓨터에 설치되어 있는 서버가 표시된다. 아래 캡쳐 사진에서 Windows 2000의 경우는 FTP 서버와 함께 웹 서버, 관리용 웹 서버가 같이 동작중이고, Windows XP의 경우는 FTP 서버만이 동작하고 있는 모습을 캡쳐한 것이다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->
 

서버의 설정 변경을 하기 위해서는 우선 설정을 변경하고자 하는 서버의 이름에 커서를 이동시킨 후, 마우스 오른쪽 버튼을 클릭한다. 그러면 아래 캡쳐 사진과 같은 메뉴가 등장한다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->
 

메뉴에서 등록정보(Windows 2000) 또는 속성(Windows XP)을 선택하면 FTP 서버의 설정을 변경할 수 있는 윈도우가 새로 등장한다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->


FTP 서버의 기본 설정 변경 (2)

FTP 서버의 설정을 변경할 수 있는 윈도우에서 가장 먼저 볼 수 있는 탭은 FTP 서버의 기본적인 동작을 제어할 수 있는 FTP 사이트 탭이다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->
 

만약 서버를 운영하는 컴퓨터에 두 개 이상의 NIC가 설치되어 있거나 두 개 이상의 IP 주소가 할당되어 있다면 IP 주소 항목에서 서버를 운영할 IP 주소를 선택할 수 있다. 대부분의 경우에는 위 캡쳐 사진과 같이 (모두 할당되지 않음)으로 설정하면 된다.

TCP 포트는 FTP 서버가 운영될 포트를 설정하는 항목이다. 일반적으로 FTP 서버는 21번 포트를 사용하기 때문에 기본값인 21을 변경할 필요는 없다. 하지만 세 가지 이유로 FTP 서버의 포트 번호를 변경해야 하는 경우가 있다.

우선, 가장 대표적인 원인은 타인의 접속을 방해하기 위해서다. 포트 번호를 바꾸면 IP 주소를 알더라도 FTP 서버에 접속을 할 수 없기 때문이다. 모르는 사람이 FTP 서버에 접속하는 것이 싫다면 포트 번호를 21번이 아닌 다른 포트 번호로 지정하고, FTP 서버에 접속하는 사람에게는 이를 알려주면 간단하게 이방인을 추방할 수 있다.

다음 원인으로는 두 개 이상의 FTP 서버가 동일 컴퓨터에서 동작하거나, 아니면 21번 포트를 다른 프로그램이 사용할 경우다. 두 개 이상의 프로그램이나 서비스가 동일 포트에서 동작을 하려고 하면 하나 또는 모든 프로그램(서비스)가 동작하지 않게 된다. 이런 경우 FTP 서버가 사용하는 포트 번호를 변경하여 포트 충돌 문제를 해결할 수 있다.

마지막으로는, 인터넷 서비스 제공자(ISP, 초고속 인터넷 업체로 변역할 수 있다)가 가입자가 서버를 운영하지 못하도록 하기 위해 서버가 사용하는 표준 포트를 막는 경우, 이를 피하기 위해 FTP 서버의 포트 번호를 변경하는 경우가 있다. 이 경우 21번이나 80번과 같이 자주 사용되는 포트 번호를 제외한 다른 포트 번호를 사용하여야 한다.

만약 포트 번호를 21번이 아닌 다른 숫자로 변경할 경우에는 되도록 1000번 이후 포트를 선택하는 편이 좋다.

연결은 FTP 서버에 동시에 몇 개의 접속을 받아들일지를 설정하는 항목이다. 서버의 상황에 맞추어 적절히 설정하면 될 듯 하다. Windows 2000 Server family의 경우 제한 없음으로 설정할 수 있지만, 나머지 OS에서는 무제한 접속 허용이 불가능하다.

연결 시간 제한은 서버에 접속한 뒤 작업을 수행하지 않는 연결을 자동으로 끊는 기능이 최종 작업 후 몇초만에 실행될지를 결정하는 항목이다. 서버의 운영 방침에 따라 적절히 설정하면 되는 항목으로, 너무 작은 숫자를 입력하면 접속자가 서버에서 작업하기 곤란해지므로 주의를 요구한다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->
 

보안 계정 탭은 크게 두 부분으로 나뉘어진다. 익명 연결 허용 부분과 FTP 사이트 운영자 부분으로 나뉘어지는데, FTP 사이트 운영자 부분은 자주 사용되지 않을 것으로 생각된다. FTP 사이트 운영자 부분은 Windows 2000 Server family에서만 활성화가 되기 때문이다. (Windows 2000의 캡쳐의 경우 Windows 2000 Server를 설치한 PC에서 캡쳐하였다.)

익명 연결 허용에 체크를 할 경우 서버의 계정이 없어도 user id에 anonymous를 입력하면 서버에 접속을 할 수 있다. 만약 FTP 서버를 누구나 접속하도록 운영하고 싶다면 이 체크박스에 체크를 하면 된다. 사용자 이름은 기본 설정 그대로 변경하지 않는 편이 유리하다. (Windows가 익명 접속용 계정을 자동으로 만드는데, 그것을 그대로 사용하는 편이 여러모로 편리하다.)

익명 연결을 사용하면 수많은 사용자가 서버에 접속하여 서버의 보안이 취약해질 가능성이 높다. 되도록 익명 연결 허용이 되지 않도록 설정하는 편이 좋을 듯 하다.


FTP 서버의 기본 설정 변경 (3)

세 번째 탭인 메시지 탭은 서버에 로그온을 했을 경우나 서버와의 접속을 끊을 때 출력되는 메시지를 설정하는 부분이다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->
 

환영(환영 메시지)은 사용자가 FTP 서버에 접속한 후 접속하여 로그온을 하였을 때 사용자에게 전송되는 메시지다. 끝내기(종료 메시지)는 사용자가 FTP 서버와의 접속을 종료할 때 사용자에게 전송되는 메시지이며, 최대 연결 수(최대 연결 수를 초과했을 때 메시지)는 서버가 받아들일 수 있는 접속수를 넘어섰을 경우 접속이 불가능함을 사용자에게 전달하는 메시지다. 최대 연결 수 설정은 FTP 사이트 탭의 연결 설정에서 변경이 가능하다.

Windows XP에만 있는 배너의 경우에는 서버에 접속한 직후 사용자에게 전송할 메시지다. 각각의 설정과 FTP 접속시의 모습은 아래와 같다.

 <!-- badtag filtered --> 
서버의 메시지 설정

 <!-- badtag filtered --> 
일반적인 접속 과정에서 나타나는 메시지. 위 메시지 설정 화면과 비교.

 <!-- badtag filtered --> 
허용 접속 수를 초과한 경우의 메시지 출력.


FTP 서버의 기본 설정 변경 (4)

홈 디렉토리 탭에서는 FTP 서버로 전송될 파일 및 FTP 서버에 전송된 파일이 저장될 디렉토리를 설정할 수 있다.

 <!-- badtag filtered -->
 
<!-- badtag filtered -->
 

FTP 사이트 디렉터리에는 읽기, 쓰기, 방문 기록이라는 세가지 체크 박스가 있다. IIS 설치 직후에는 쓰기 체크 박스에 체크가 되어 있지 않은데, 이러면 사용자가 서버에 업로드를 할 수 없는 문제가 발생한다. 쓰기 체크 박스에 체크를 하여야 이런 문제를 해결할 수 있다.

디렉터리 목록 스타일 항목에서는 기본값으로는 MS-DOS로 설정이 되어 있지만, UNIX로 설정값을 변경하는 것을 추천한다. MS-DOS로 설정될 경우 대부분의 FTP 클라이언트 소프트웨어가 디렉터리 목록을 해석하지 못하여 동작 불가능 상태가 되기 때문이다.

마지막 탭인 디렉터리 보안은 Windows 2000 Server family에서만 활성화가 된다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->
 

디렉터리 보안 탭에서는 특정 IP 주소에 대한 접속 거부를 설정할 수 있다. 하지만 대부분의 개인 서버의 경우, 이러한 기능을 사용할 필요가 거의 없기 때문에 활성화가 되지 않는다고 해서 큰 불편은 없으리라 생각된다.


접속 ID 생성 (1)

만약 보안 계정 탭에서 익명 연결 허용 체크 박스에 체크를 하지 않은 경우에는 접속용 계정을 만들어야만 외부에서 서버로 접속을 할 수 있다. Administrator 계정을 사용하여도 되기는 하지만, 모든 권한이 있는 Administrator 계정의 정보가 많은 사람에게 퍼진다는 것은 '내 서버를 망가뜨려도 좋습니다.'라고 말하는 것과 동일한 일이다. 그렇기 때문에 귀찮더라도 FTP 서버에 접속하는 사람들에게 접속용 계정을 발급해야만 한다.

접속 계정을 생성하기 위해서는 다음과 같은 순서를 거쳐야 한다.

1. Windows 2000의 경우 제어판에서 관리 도구를 선택한다.

  

Windows XP의 경우에는 제어판에서 성능 및 유지 관리를 선택한다. (만약 제어판 설정이 '클래식 보기'일 경우는 아래를 참조)

 <!-- badtag filtered --> 

성능 및 유지 관리 윈도우에서 관리 도구를 선택한다.

 <!-- badtag filtered --> 

만약 제어판이 '클래식 보기'로 설정되어 있을 경우에는 관리 도구를 직접 선택할 수 있다.

2. 관리 도구 윈도우에서 컴퓨터 관리를 실행시킨다.

  
 
<!-- badtag filtered -->


접속 ID 생성 (2)

3. 컴퓨터 관리 윈도우에서 시스템 도구 아래의 로컬 사용자 및 그룹의 하위 메뉴인 사용자를 선택한다. 그러면 컴퓨터 관리 윈도우의 오른쪽에 현재 시스템에 등록되어 있는 계정이 표시된다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->
 


4. 컴퓨터 관리 윈도우의 오른쪽 부분에서 마우스의 오른쪽 버튼을 클릭하면 아래 그림과 같은 메뉴가 등장한다. 메뉴에서 새 사용자를 선택한다.

 <!-- badtag filtered --> 
 
<!-- badtag filtered -->
 


4. 새 사용자 메뉴를 선택하면 아래 그림과 같이 새 사용자 윈도우가 등장한다.

  
  


새 사용자 윈도우에 사용자 이름암호, 암호 확인에 계정 정보를 입력한다. 그 뒤 다음 로그온할 때 반드시 암호 변경의 체크박스를 해제한다. 그러면 아래의 두 체크박스가 선택 가능하게 변경되는데, 두 체크박스에 모두 체크 표시가 있도록 선택한다.

  
  

 

전체 이름설명 항목은 입력을 하고 싶다면 계정에 대한 적절한 설명을 입력한다. (입력하지 않아도 관계 없다.) 위 캡쳐 사진과 같이 설정을 했다면 만들기 버튼을 클릭한다.

내용출처 : [기타] 블로그 집필 - Hyunmin Style's 

'게임 개발' 카테고리의 다른 글

IME에 관한 간단한 글  (0) 2005.10.26
메모리 누수 잡기  (0) 2005.10.25
C++사이트 링크  (0) 2004.07.30
소켓 프로그래밍 기초  (0) 2004.07.22
Application 프로그래밍시 알아두어야 할 지식들  (0) 2004.07.17
Posted by 노을삼킨별
,

C++사이트 링크

게임 개발 2004. 7. 30. 16:56

출처 : http://blog.naver.com/newcbs/40003221857
<C++사이트 링크>

ACM - The ABCs of Writing C++ Classes
Guru of the Week - Guru of the Week
STL - Standard C++ Library Tutorial 한글
STL - Standard C++ Library (SGI)
STL - Visual C++ 의 STL Sample
C++ FAQ - C++ FAQ
MSJ - Microsoft Systems Journal
VC++ STL Reference - VC++ STL Reference
Thinking in C++ - Thinking in C++ 온라인 북
코드 구루 - 코드 샘플이 많은 개발관련 사이트
OpenIL - Open Image Library
Win32ASM - Iczelion's Win32 Assembly Homepage
Priority Que & STL - by Mark Nelson (Dr. Dobb's Journal)
STLPort - 범용, 공개, 오픈소스 STL
데이타 압축 - 데이타 압축 관련 링크 모음
C++ Optimize - C++ 최적화 방법에 대한 내용
STL newbie - STL 초보자를 위한 문서
코드프로젝트 - 다양한 장르의 프로그래밍 강좌
MTL - Matrix Template Library
CPlusPlus - C++ Tutorial
AssemRef - Assembler Programmer's Reference
공짜 C/C++ 컴파일러들 - 공개 C/C++ 컴파일러들에 대한 상세한 목록
어셈러브 - 국내 어셈블리 관련 홈페이지
C++ Online Books - C++ 관련 공짜 온라인 북 링크
STL Document - RogueWave Software 의 STL 튜토리얼 및 레퍼런스
Blitz++ - 객체지향 공학용 수치계산 라이브러리(C++)
행렬 라이브러리 비교 - C/C++ 용 행렬 라이브러리 비교평가
AoA - Art of Assembly. 최고의 어셈블리 공개문서
Win32ASM_comm - Win32 어셈블러 커뮤니티 포럼
펜티엄 명령 - Pentium Instruction Formats and Encoding
MMX소개 - 엔젤 코드의 MMX 소개
전웅님홈 - K&R2 레퍼런스 매뉴얼 번역이 있음.
CodeProject - 공개 소스 코드 및 튜토리얼

Posted by 노을삼킨별
,

1. 소켓 프로그래밍 기초

 

(1)    윈속과 TCP/IP

윈속이라는 API TCP/IP 지원하며, 추후 다른 프로토콜도 지원할 있다.

 

응용 프로그램

윈속API  (WINSOCK.DLL)

TCP/UDP

IP

이더넷

*물리계층, Data Link계층, 네트웍 계층, Transport Layer : 시스템 O/S에서 처리.

 (세션 계층, Presentation Layer) Application Layer : 소켓 프로그래밍.

 

(2)    Client & Server 형태로 동작

서버쪽 프로세스는 초기화 과정을 거친 클라이언트의 요구를 받기 위한 상태로 대기한다. 이때 클라이언트의 요청을 받기 위한 특정 포트(port)번호가 할당되며, 서버 프로세스는 포트를 감시한다. 클라이언트가 서버의 주소와 포트로 데이터를 보내면 서버는 대기상태에서 깨어나 해당 서비스를 수행한다. 소켓은 양방향 전송을 지원하기 때문에 하나의 소켓을 열면 이를 통해 데이터를 보내는 기능과 받는 기능을 동시에 수행할 있다.

 

(3)    연결형과 비연결형

1)    연결형 (Connection-Oriented)

a. Stream Socket이라고도 하며 TCP프로토콜 사용.

b. 신뢰성이 있고, 다량의 데이터 전송에 적합.

c. Packet 보내어진 순서대로 중복 없이 도착되도록 보장 받는다.

d. 패킷 경계선이 없는 계속적인 양방향 스트림 데이터를 주고 받는다.

  [ 4계층인 TCP 연결 설정된 상대방 주소와 포트를 관리하여 받은 패킷의 상대방 주소와 포트가 연결 설정된 같으면 주소, 포트 정보를 데이터만 상위 계층에 올려보내고 틀리면 패킷은 버린다.  TCP 상위 계층은 상대 주소, 포트 정보 없이 데이터가 스트림으로 전달된다. ]

 

2)    비연결형 (Connectionless)

a. Datagram Socket이라고도 하며 UDP 프로토콜 사용

b. 신뢰성이 없고, 소량의 데이터 전송에 적합

c. 효율적인 네트웍 사용 (연결형보다 빠른 속도)

d. Packet 보내진 순서대로 도착하지 않을 수도 있으며 중복 또는 아예 도착하지

수도 있다.  그래서 패킷의 데이터 헤더에 보내는 데이터가 번째 블록인지

정해서 보내야 상대방이 순서대로 정열할 있음. (응용 프로그램에서 처리)

e. 패킷 단위로 데이터가 끊어져서 읽히게 된다.

  [ 4계층의 UDP 연결 설정된 주소 포트가 없으므로 포트로 도착한 모든

(상대방 주소, 포트 포함) 그대로 상위 포트에 올려보낸다.  UDP 상위 계층은

패킷 크기로 Datagram 전달된다.  

*, recvfrom(), sendto() 이용할 때마다 상대편 주소와 포트정보를 주고받아야 한다.

 

(4)    소켓 통신을 위한 5가지 기본 요소

프로토콜 :           연결형(TCP) or 비연결형(UDP)

자신의 주소 :   Host구분

자신의 포트 :   Host내의 Process구분

상대방 주소 :

상대방 포트 :

 

(5)    버클리 소켓과 윈속의 차이

윈속은 버클리 소켓을 대부분 따른다.

, 블록킹 문제를 해결하기 위해 Windows Event-Driven특성을 살려 비동기용 확장 함수를 추가하였다.

 

(6)    블록킹 (Blocking)

블록킹 상태이면 블록킹된 함수가 결과를 리턴하고 끝마칠 때까지 제어권이 돌아오지

않는다. , 다른 응용 프로그램이 이상 실행될 없게 된다.

비블로킹 상태이면 함수를 실행하는 동안에도 프로그램은 계속해서 사용 가능하다.

소켓을 생성하면 기본적으로 블록킹 상태로 동작한다. 윈도우 상에서는 함수를 블로킹

상태로 호출하는 경우 이벤트를 받을 없게 된다.

 

Ex) recv()함수를 호출해 소켓으로부터 10Byte 데이터를 읽으려고 하는 경우 수신 버퍼에 도착한 데이터가 없다면, 읽어 들일 데이터가 도착하거나 또는 연결이 끊어져 오류가 발생할 때까지 recv()함수로부터 제어가 돌아오지 않는다.

*해결 방안

a.   블록킹 (Blocking Hook)

Windows 프로그램이 GetMessage() PeekMessage()등을 호출할 때만 작업 전환을 하므로 블록킹은 시스템 전체를 정지시킬 위험이 있다. 이를 막기 위해 윈속에서는 블록킹 가능성이 있는 윈속API 호출하면 무한 루프를 돌면서 BlockingHook() 호출한다.

 

b.   비블록킹 (non-blocking) 상태 설정

소켓을 새로 열면 처음에는 블록킹 상태로 동작하지만, 이를 비블럭킹 상태로 전환할 수도 있다. 비블럭킹 상태에서는 요구된 작업을 즉시 종료할 없을 블록킹되는 대신에 바로 리턴해 버린다. (그리고, 관련 함수를 계속 호출)

소켓의 블록킹 상태 전환 : ioctlsocket()함수 사용.

 

  *위의 방법은 사용자 프로그램에서 루프를 돌면서 특정 상황이 발생하기를 계속 검사해야 하므로 상당히 비효율적이다.                 

 

(7)    비동기 함수 (Asynchronous Function)

Windows 프로그램은 기본적으로 메시지를 받아서 그에 해당하는 작업을 처리하는 형태로 동작하므로 네트워킹에 관련된 작업도 특정 사건이 발생했을 메시지를 받아 처리하도록 지원하기 위한 것이 비동기 함수이다. , 수신된 데이터가 있는지를 되풀이해서  검사해 보는 것이 아니라, 데이터 수신이라는 사건이 발생하면 시스템에서 자동으로 메시지를 윈도우 프로시저에 보내는 방식이다.

 

(8)    바이트 순서 (Byte Order)

프로세서에 따라 메모리에 데이터를 저장하는 방식이 다르기 때문에 시스템에서는 문제가 없지만 다른 저장 방식을 사용하는 시스템과 통신을 하는 경우는 문제가 된다.

char 같은 1Byte 데이터는 그냥 전송하면 되지만 short (2Byte) long(4Byte) 같은 데이터는 변환이 필요하다.

 

Host Byte Order

 : Little Endian이라고도 하며, 하위 바이트를 낮은 주소에 저장

 Ex) 인텔 x86계열 프로세서

 

네트워크 바이트 순서 (N/W Byte Order)           소켓 통신 표준

 : Big Endian           상위 바이트를 낮은 주소에 저장

                      Ex) 모토로라 68000계열

 

*바이트 순서 변환 함수

 htons ( u_short hostshort );

 ntohs ( u_short netshort );

 

2. 윈속 지원 클래스

 

MFC에서는 WinSock 관련된 많은 API 추상화한 3가지 소켓 관련 클래스를 제공.

 

CAsyncSocket                  비동기 통신 지원

CSocket                     동기 통신 지원

CSocketFile                  N/W 상으로 전송할 데이터를 파일처럼 취급. 직렬화 활용.

 

계승도.

(1) CObject – CAsyncSocket

 1) 블록킹 문제 해결 :                   비동기 모드 함수 사용하여 데이터 교환

 2) Byte Order 문제 :     ntoh~(), hton~()함수를 사용하여 네트워크 바이트 순서로 바꾸어 전송하고 데이터를 받을 때도 호스트 바이트 순서로 바꾸어 받아야 한다.

( char 1 byte 데이터는 상관없지만 2byte이상의 데이터 (정수형, 실수형 ) 바이트 순서 처리를 해주어야 한다.)

 

(2) CObject – CAsyncSocket - CSocket

 데이터를 보내고 받는 것을 관리하는 클래스 CSocketFile CArchive 함께 동작한다.

 블록킹 된다.

 

CObject - CFile - CSocketFile

 

 


3. MFC 이용한 소켓 프로그래밍.

CAsyncSocket 이용한 연결형 통신 구조

 

서버 영역 프로그래밍                                                                        클라이언트 영역 프로그래밍

 

*중심 소켓 : 계속해서 새로운 클라이언트를 기다림.

 

//객체 생성 ( Stack상에 구현 )                                             //객체 생성

CAsyncSocket* pSocket = new CAsyncSocket ;                                     

 

// port 2000번으로 서버 소켓 생성                                            //클라이언트 소켓 생성

pSocket->Create(2000);  //default : Stream Socket                        pSocket->Create();

[ 비연결형  pSocket->Create( 2000, SOCK_DGRAM );                // Datagram Socket생성 ]

 

pSocket->Listen();                  //Client접속 기다림.

 

*자식 소켓 생성

                                                                                                            //서버의 IP & Port No 접속 설정

CAsyncSocket  Sock;                                                              pSocket->Connect(Adr, 2000);

 

//자식 소켓에 현재 연결이 들어온

클라이언트 연결시켜줌                                   

PSocket->Accept(Sock);                                                                        

 

//클라이언트와의 data통신

Sock.Send( “안녕!” );                                                            pSocket->Receive(data);

 

Sock.Receive( data );                                                                  pSocket->Send(“나도 안녕”);

 

*Event처리

 

OnAccept : 클라이언트가 Connect 실행하여 서버에 접속하고자 서버에서는 새로운 클라이언트가 들어오면 OnAccept함수가 실행된다.

 

OnReceive : 새로운 데이터가 들어왔을 경우에는 OnReceive라는 함수가 실행된다.


Posted by 노을삼킨별
,

출처 : www.debuglab.com 

이 자료를 정리하신 분은 서우석이라는 분인데..정말 대단하다라는 생각이 듭니다.

어쩜 이렇게 정리를 잘 하셨을까.. 부럽다는 생각만 드는군요..ㅡㅡ

-------------------------------------------------------------------

Home

lastest update : 2001.08.06






Posted by 노을삼킨별
,

출처 : http://blog.naver.com/zetatoss/20001453436

적용 대상
이 문서는 이전에 다음 ID로 출판되었음: KR601929

요약

Visual C++ 어플리케이션인 경우 디버그 빌드의 메모리 관련 함수를 사용하면 메모리 누수가 난 위치(파일명과 라인)를 Visual C++ 로부터 보고 받을 수 있습니다. 이들 메모리 함수에는_malloc_dbg, _calloc_dbg, _realloc_dbg, _expand_dbg, _free_dbg, _msize_dbg 및 DEBUG_NEW 등이 있습니다.

추가 정보

MFC 가 보고하는 메모리 누수 정보

Visual C++ 의 MFC 프로그램을 개발중이라면 이 어플리케이션이 디버그 모드로 실행된 경우, 종료 시 디버그 창에 메모리 누수관련 정보가 다음과 같이 표시됩니다.
Detected memory leaks! Dumping objects -> plex.cpp(31) :
{173587} normal block at 0x03C02F00, 124 bytes long. Data:
< P j > 00 00 00 00 00 00 00 00 C0 50 13 00 A8 6A 14 00 map_pp.cpp(72) :
{173586} normal block at 0x03C02FB0, 68 bytes long. Data:
< > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 {67576}
normal block at 0x04021A80, 288 bytes long. Data:
< L_ > 01 00 00 00 00 00 00 00 14 CB 4C 5F 01 00 CD CD {67575}
normal block at 0x04021BD0, 288 bytes long. Data: < L_ >
01 00 00 00 00 00 00 00 14 CB 4C 5F 01 00 CD CD {63195}
normal block at 0x03CB85E0, 124 bytes long. Data:
< x J_ x J_> 0F 00 00 00 78 C2 4A 5F 19 08 05 96 78 C2 4A 5F strcore.cpp(118) :
{56689} normal block at 0x03C4CB00, 19 bytes long. Data:
< > 01 00 00 00 06 00 00 00 06 00 00 00 B0 C5 B7 A1 strcore.cpp(118) :
{56679} normal block at 0x03C4B170, 19 bytes long. Data:
< > 01 00 00 00 06 00 00 00 06 00 00 00 C1 D6 B0 A1
Object dump complete. The thread 0xDE has exited with code 0 (0x0).
The program 'E:\Wow\BinD\Wow.exe' has exited with code 0 (0x0)

디버그 버전 메모리 함수

위의 내용에는 좌측에 파일 이름이 표시된 것이 있고 그렇지 못한 것이 있습니다. 파일 이름이 표시된 것은 디버그 빌드 메모리 함수를 이용하여 할당 받은 경우이고, 파일 이름이 없는 것은 그렇지 못한 경우입니다. 파일 이름을 표시하기 위해서는 요약에서 언급한 종류의 디버그 버전 함수를 사용해야 합니다.

먼저, New 함수는 MFC 프로젝트에서 기본으로 디버그 버전을 사용하도록 되어 있으며 반드시 디버그 빌드인 경우에만 파일명이 표시됩니다. Release 빌드의 경우는 누수의 위치가 표시되지 않습니다. New 함수가 디버그 빌드가 적용되는 이유는 각 CPP 파일에 다음과 같은 라인이 첫 부분에 있기 때문입니다.
#ifdef _DEBUG #define new DEBUG_NEW #endif 
기타_malloc_dbg, _calloc_dbg, _realloc_dbg, _expand_dbg, _free_dbg, _msize_dbg 함수는 crtdbg.h 에 다음과 같이 정의되어 있습니다.
#ifdef _CRTDBG_MAP_ALLOC
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__,__LINE__)
#define calloc(c, s) _calloc_dbg(c, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define realloc(p, s) _realloc_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define _expand(p, s) _expand_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define free(p) _free_dbg(p, _NORMAL_BLOCK)
#define _msize(p) _msize_dbg(p, _NORMAL_BLOCK)
#endif /* _CRTDBG_MAP_ALLOC */
따라서, 다음과 같이 선언하시면 됩니다.
#define _CRTDBG_MAP_ALLOC #include "crtdbg.h" 

할당번호

‘MFC 가 보고하는 메모리 누수 정보’ 부분의 정보에서 “{“ 와 “}” 으로 둘러싸인 부분에 숫자가 있습니다. 이는 할당번호라고 하며 이를 이용해서 메모리 누수가 나는 곳으로 직접 Break Point 를 걸어 확인할 수도 있습니다.

예를 들어, 다음과 같은 함수가 있습니다. 이 함수는 특정 할당번호를 갖는 위치의 malloc 함수에서 멈추어서 사용자가 그 위치를 확인하게 해 줍니다.
// testbreak.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <malloc.h>
#include <crtdbg.h>

int main(int argc, char* argv[])
{
long allocReqNum;

char *my_pointer;
/* * Allocate "my_pointer" for the first * time and ensure that it gets allocated correctly */
my_pointer = (char*)malloc(20);

_CrtIsMemoryBlock(my_pointer, 10, &allocReqNum, NULL, NULL);

/* * Set a breakpoint on the allocation request * number for "my_pointer" */
_CrtSetBreakAlloc(allocReqNum+2);
_crtBreakAlloc = allocReqNum+2;
/* * Alternate freeing and reallocating "my_pointer" * to verify that the
debugger halts program execution * when it reaches the allocation request */
free(my_pointer);
printf("wow1\n");
my_pointer = (char*)malloc(10);
free(my_pointer);
printf("wow2\n");
my_pointer = (char*)malloc(10);
free(my_pointer);
}
프로그램을 디버그 모드로 실행하면 _heap_alloc_dbg 에서 멈춥니다. 여기서 Step Out 하면 차례로 _nh_malloc_dbg 를 거쳐서 malloc 을 통해서 본래 위치인 my_pointer = (char*)malloc(10); 로 돌아오므로 누수가 난 위치를 알아내는데 사용할 수 있습니다.

이 방법은 할당 번호가 고정적으로 누수 된다고 보고되는 경우에만 사용가능 합니다.

MFC 이외의 어플리케이션

MFC 는 사용자가 특별히 작업을 해주지 않아도 메모리 누수를 보고해 주지만 그 외의 Visual C++ 함수인 경우는 메모리 누수를 보고해 주는 함수인 _CrtDumpMemoryLeaks() 를 사용합니다.

콘솔 프로그램에서 누수보고 예제

// console.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
/*****************************************************************
* EXAMPLE 1 * * This simple program illustrates the basic debugging features *
* of the C runtime libraries, and the kind of debug output *
* that these features generate. *
*****************************************************************/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>
// This routine place comments at the head of a section of debug output
void OutputHeading( const char * explanation )
{
_RPT1( _CRT_WARN, "\n\n%s:\n**************************************\
************************************\n", explanation );
}
// The following macros set and clear, respectively, given bits
// of the C runtime library debug flag, as specified by a bitmask.
#ifdef _DEBUG
#define SET_CRT_DEBUG_FIELD(a) \ _CrtSetDbgFlag((a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
#define CLEAR_CRT_DEBUG_FIELD(a) \ _CrtSetDbgFlag(~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
#else
#define SET_CRT_DEBUG_FIELD(a) ((void) 0) #define CLEAR_CRT_DEBUG_FIELD(a) ((void) 0)
#endif

void main( )
{
char *p1, *p2;
_CrtMemState s1, s2, s3;

// Send all reports to STDOUT
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
_CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );

// Allocate 2 memory blocks and store a string in each
p1 = (char*)malloc( 34 );
strcpy( p1, "This is the p1 string (34 bytes)." );
p2 = (char*)malloc( 34 );
strcpy( p2, "This is the p2 string (34 bytes)." );
OutputHeading( "Use _ASSERTE to check that the two strings are identical" );
_ASSERTE( strcmp( p1, p2 ) == 0 );
OutputHeading( "Use a _RPT macro to report the string contents as a warning" );
_RPT2( _CRT_WARN, "p1 points to '%s' and \np2 points to '%s'\n", p1, p2 );
OutputHeading( "Use _CRTMemDumpAllObjectsSince to check the p1 and p2 allocations" );
_CrtMemDumpAllObjectsSince( NULL );
free( p2 );
OutputHeading( "Having freed p2, dump allocation information about p1 only" );
_CrtMemDumpAllObjectsSince( NULL );

// Store a memory checkpoint in the s1 memory-state structure
_CrtMemCheckpoint( &s1 );

// Allocate another block, pointed to by p2
p2 = (char*)malloc( 38 );
strcpy( p2, "This new p2 string occupies 38 bytes.");

// Store a 2nd memory checkpoint in s2 _CrtMemCheckpoint( &s2 );
OutputHeading( "Dump the changes that occurred between two memory checkpoints" );
if ( _CrtMemDifference( &s3, &s1, &s2 ) ) _CrtMemDumpStatistics( &s3 );

// Free p2 again and store a new memory checkpoint in s2 free( p2 );
_CrtMemCheckpoint( &s2 );
OutputHeading( "Now the memory state at the two checkpoints is the same" );
if ( _CrtMemDifference( &s3, &s1, &s2 ) ) _CrtMemDumpStatistics( &s3 );
strcpy( p1, "This new p1 string is over 34 bytes" );
OutputHeading( "Free p1 after overwriting the end of the allocation" );
free( p1 );

// Set the debug-heap flag so that freed blocks are kept on the
// linked list, to catch any inadvertent use of freed memory
SET_CRT_DEBUG_FIELD( _CRTDBG_DELAY_FREE_MEM_DF );
p1 = (char*)malloc( 10 );
free( p1 );
strcpy( p1, "Oops" );
OutputHeading( "Perform a memory check after corrupting freed memory" );
_CrtCheckMemory( );

// Use explicit calls to _malloc_dbg to save file name and line number
// information, and also to allocate Client type blocks for tracking
p1 = (char*)_malloc_dbg( 40, _NORMAL_BLOCK, __FILE__, __LINE__ );
p2 = (char*)_malloc_dbg( 40, _CLIENT_BLOCK, __FILE__, __LINE__ );
strcpy( p1, "p1 points to a Normal allocation block" );
strcpy( p2, "p2 points to a Client allocation block" );

// You must use _free_dbg to free a Client block
OutputHeading( "Using free( ) to free a Client block causes an assertion failure" );
free( p1 );
free( p2 );
p1 = (char*)malloc( 10 );
OutputHeading( "Examine outstanding allocations (dump memory leaks)" );
_CrtDumpMemoryLeaks( );

// Set the debug-heap flag so that memory leaks are reported when
// the process terminates. Then, exit.
OutputHeading( "Program exits without freeing a memory block" );
SET_CRT_DEBUG_FIELD( _CRTDBG_LEAK_CHECK_DF );
}

콘솔 프로그램에서 누수보고 예제 결과

 G:\works\console\Debug>console
Use _ASSERTE to check that the two strings are identical:
**************************************************************************
G:\works\console\console.cpp(60) :
Assertion failed:
strcmp( p1, p2 ) == 0 Use a _RPT macro to report the string contents as a warning:
**************************************************************************
p1 points to 'This is the p1 string (34 bytes).'
and p2 points to 'This is the p2 string (34 bytes).'
Use _CRTMemDumpAllObjectsSince to check the p1 and p2 allocations:
**************************************************************************
Dumping objects -> {45} normal block at 0x00431F40, 34 bytes long.
Data: <This is the p2 s> 54 68 69 73 20 69 73 20 74 68 65 20 70 32 20 73 {44}
normal block at 0x00431F90, 34 bytes long.
Data: <This is the p1 s> 54 68 69 73 20 69 73 20 74 68 65 20 70 31 20 73
Object dump complete. Having freed p2, dump allocation information about p1 only:
**************************************************************************
Dumping objects -> {44} normal block at 0x00431F90, 34 bytes long.
Data: <This is the p1 s> 54 68 69 73 20 69 73 20 74 68 65 20 70 31 20 73
Object dump complete. Dump the changes that occurred between two memory checkpoints:
**************************************************************************
0 bytes in 0 Free Blocks. 38 bytes in 1 Normal Blocks. 0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks. 0 bytes in 0 Client Blocks. Largest number used: 4 bytes.
Total allocations: 38 bytes.
Now the memory state at the two checkpoints is the same:
**************************************************************************
Free p1 after overwriting the end of the allocation:
**************************************************************************
memory check error at 0x00431FB2 = 0x73, should be 0xFD.
memory check error at 0x00431FB3 = 0x00, should be 0xFD.
DAMAGE: after Normal block (#44) at 0x00431F90.
Perform a memory check after corrupting freed memory:
**************************************************************************
memory check error at 0x00431FA0 = 0x4F, should be 0xDD.
memory check error at 0x00431FA1 = 0x6F, should be 0xDD.
memory check error at 0x00431FA2 = 0x70, should be 0xDD.
memory check error at 0x00431FA3 = 0x73, should be 0xDD.
memory check error at 0x00431FA4 = 0x00, should be 0xDD.
DAMAGE: on top of Free block at 0x00431FA0.
DAMAGED located at 0x00431FA0 is 10 bytes long.
Using free( ) to free a Client block causes an assertion failure:
**************************************************************************
dbgheap.c(1051) : Assertion failed: pHead->nBlockUse == nBlockUse
Examine outstanding allocations (dump memory leaks):
**************************************************************************
Detected memory leaks! Dumping objects -> {50}
normal block at 0x00431EA0, 10 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD Object dump complete.
Program exits without freeing a memory block:
**************************************************************************
Detected memory leaks! Dumping objects -> {50}
normal block at 0x00431EA0, 10 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD Object dump complete.
G:\works\console\Debug>

본 문서의 정보는 다음의 제품에 적용됩니다.

  • Microsoft Visual C++ 6.0

출처 : http://support.microsoft.com/default.aspx?scid=kb;ko;601929

Posted by 노을삼킨별
,