컴퓨터공부 362

C Runtime 환경의 메모리 릭 잡는 방법 ( Memory Leak )

간단히 메모리 릭 발생여부를 알아내고 이를 해결하는 방법에 대해서 알아봅시다. 이는 MS 사에서 CRT(C Runtime) 라이브러리로 제공해는 CRTDBG 를 이용할 겁니다. 생각보다 쉬운 반면 그 기능은 막강하지요. 일단 프로그램 정의부에 다음과 같이 추가합니다. #include #define CRTDBG_MAP_ALLOC #ifdef _DEBUG #define new new( _NORMAL_BLOCK, __FILE__, __LINE__ ) //궁금하시면 제 게시글 중 편을 보세요. #endif 이제 메인 진입 부 처음에 다음과 같이 선언합니다. 일반 main() 이라고 가정합니다. 물론 WinMain() 일 수도 있습니다. void main() { _CrtSetDbgFlag( _CRTDBG_ALLO..

## preprocessor, string 합치기

## preprocessor은 문자를 합치는 기능이있다. ANSI 이전의 compiler에서는 아래 것을 이용하면 된다. #define XPaste(s) s #define Paste2(a, b) XPaste(a)b + #include #include #define Paste(a, b) a##b #define AB "ab" #define XPaste(s) s #define Paste2(a, b) XPaste(a)b #define A "aaa" #define B "bbb" int main() { printf("%s\n", Paste(A, B) ); // Paste에 보이는 그대로를 붙인다. printf("%s\n", Paste2(A, B) ); // define 되어 있는 것을 붙인다. return 0; }

#error

#error은 위에 있는 #if 조건이 맞지 않을경우 컴파일 에러를 발생 시킨다. VALUE 초기화 실수를 방지할 수 있다. + #include #include #define VALUE 99 #if !(VALUE % 5 == 0 && VALUE > 0) #error VALUE must be a multiple of 5 and more than 0 // VALUE가 "#if !(VALUE % 5 == 0 && VALUE > 0)" 조건에 맞지 않으면 error 발생 // => fatal error C1189: #error : VALUE must be a multiple of 5 and more than 0 #endif #endif int main() { return 0; } 출처 : http://74.12..

assert.h header, assert() 로 설명을 달자

assert 함수는 아래와 같이 사용하는 거다!! assert와 함께 설명까지!!! 이건 assert() 함수를 까보지 않고서는 하지 못하는 스킬이다. god damm!!!! 너무 멋지잖아!! assert( 0 != NULL && "포인터 메모리 할당을 실패했잖아" ); + 다음은 C99의 assert.h이다. 코드가 예술이다.. + #include #include // The following is an implementation of the Standard C99 version of : /* assert.h header */ #undef assert #ifdef NDEBUG #define assert(_Ignore) ((void)0) // DEBUG를 사용하지 않으면 assert가 실행하지 않게 함 ..

debug에 사용할 메시지

printf("\n Debug line %d, in the function %s, in the file %s.\n", __LINE__, __func__, __FILE__); + C99 에 새로 추가된 __func__ : 현재 function을 적어 줍니다. __FILE__과 __LINE__ 등은 어디 에나 정의되어 있지 않습니다. __FILE__은 몰라도 __LINE__을 # define으로 정의하는 등있는 이유가없습니다. 이 같은 정의하지 않고도 마음대로 선언되는 매크로 것을 통합 매크로라고합니다. ANSI C는 6 종류의 내장 매크로를 규정하고있습니다. 매크로 이름 어떻게 전개되는지 __FILE__ __FILE__ 파일 이름 리터럴 문자열. __LINE__ __LINE__ 줄 번호를 나타내는 10 진..

Cfaq 9

Q 11.18 메시지 “warning: macro replacement within a string literal”은 무슨 뜻 이죠? Answer : ANSI 이전의 어떤 컴파일러/전처리기는 매크로 정의를 다음과 같이 정 의할 경우: #define TRACE(var, fmt) printf("TRACE: var = fmt\n", var) 다음과 같은 식으로 호출하게 되면: CHAPTER 11. ANSI/ISO STANDARD C 193 TRACE(i, %d); 다음과 같이 확장하게 됩니다: printf("TRACE: i = %d\n", i); 즉, 매크로 인자로 나온 이름이 문자열 안에 있는 경우라도 확장시켜 버립 니다. (물론 이러한 버그가 위와 같이 유용하게 쓰일 수도 있지만, 이 것은 대개 초창기 컴..

cfaq 8

Q 10.4 여러 문장으로 이루어진 매크로를 만드는 좋은 방법 좀 알려 주세요. Answer 이런 매크로를 만드는 일반적인 방법은 매크로 자체를 일반 함수처럼 쓸 수 있도록 하는 것입니다. 즉 호출하는 쪽에서 마지막 ‘;’을 직접 써 주게 하고 매크로의 몸통에서는 ‘;’을 따로 써 주지 않는 식으로 쓰는 것입니다. 예를 들면: MACRO(arg1, arg2); 그러므로 매크로 정의는 단순히 여러 statement를 중괄호로 둘러싼 ‘compound statement’ 형식으로 만들 수 없습니다. 왜냐하면 이 매크로가 호 출될 때 세미콜론이 추가적으로 붙는다면 if나 if/else 문장에서 에러가 발생할 수 있기 때문입니다. 다음 코드를 보기 바랍니다: if (cond) MACRO(arg1, arg2); ..

Cfaq7

Q 8.9 제 컴파일러에 버그가 있습니다. sizeof('a')의 값이 sizeof(char)인 1 로 나오지 않고, 2가 나옵니다. Answer 놀랍게도, C 언어에서 문자 상수(character constant)의 타입은 int입니 다. 따라서 sizeof('a')는 sizeof(int)와 같습니다. (C++에서는 조금 다릅니다.) 덧붙여 질문 7.8도 참고하시기 바랍니다. Note 참고로 C++에서 문자 상수의 타입은 char입니다. 즉, sizeof('a')는 sizeof(char)와 같습니다. Q 10.1 다음과 같이 간단한, 함수와 비슷한 매크로를 만들려고 합니다. #define square(x) x * x 그런데, 가끔씩 제대로 동작하지 않습니다. 왜 그럴까요? Answer 매크로 확장(ex..

Cfaq 6

Q 7.29 (질문 6.14를 따라서) 배열을 동적으로 할당한 다음, 이 배열의 크기를 바꿀 수 있을까요? Answer 물론입니다. realloc이 바로 그 역할을 해 주는 함수입니다. (예를 들어, 질문 6.14에 나온 것처럼 dynarray) 동적으로 할당된 배열의 크기를 바꾸 려면 다음과 같은 코드를 씁니다: dynarray = (int *)realloc((void *)dynarray, 20 * sizeof(int)); realloc이 항상 메모리 블럭의 크기를 늘리는데 쓰이는 것은 아닙니다. realloc은, 가능하면, 전달받은 인자와 같은 포인터 값을 돌려주지만, 요 청한 크기에 맞게 메모리 블럭을 다시 찾을 경우에는, 인자로 전달된 포인 터 값과는 다른 값을 돌려줍니다. 이 경우, 인자로 전달..

애자일 방법론 세미나를 듣고..

애자일 방법론에 대한 세미나를 들을 기회가 있어서 들었다. 우선 김창준씨에 대해서 말하자면.. 겉으로 보기에는 특별한 포스가 느껴지진 않는다, 하지만 말을 할 때면 숨겨진 포스가 풍긴다. 개발자이기도 해서 그런지 겉치레보다 실속을 차리는 느낌이 강했다. 뭐.. 이런거야 내 개인적인 생각이고.. 세미나 들은 후에 mind map을 만들어 봤다.(클릭해서 보세요) 세미나를 들었으니 이제 To do를 생각해봐야지.. To do. 1. 짝 프로그래밍(http://xper.org/LineReaderTdd/) 2. XP의 이해(XP for one user) 3. 지식 공유 시스템 구축 4. 암묵적 지식의 공유 5. 가치 위주 개발

컴퓨터공부 2009.04.04