From 09245f44ed3808460615bb620642156f15def016 Mon Sep 17 00:00:00 2001 From: sauron Date: Mon, 25 Aug 2025 14:19:37 +0900 Subject: [PATCH] commit 2025-08-25 14:19 edit a bit ZCppMain/ZMainHead.H --- ZCppMain/ZMainHead.H | 68 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/ZCppMain/ZMainHead.H b/ZCppMain/ZMainHead.H index 6947677..48106ad 100644 --- a/ZCppMain/ZMainHead.H +++ b/ZCppMain/ZMainHead.H @@ -3728,7 +3728,7 @@ namespace ZNsCPP */ #endif // __linux__ - __linux__라는 이름을 사용하라. linux가 아니다. + __linux__라는 이름을 사용하라. linux 가 아니다. 후자가 정의되어 있기는 하지만 POSIX 규격에는 맞지 않기 때문이다. ■ 각 OS 별 Shared Library PATH 환경 변수 (2012-04-08 19:25:00) @@ -3797,31 +3797,39 @@ namespace ZNsCPP */ (2007/04/03 16:20) http://blog.naver.com/cppis/60036113050 - bugmail에게 More Effective C++을 빌려 보던 중 일반적으로 많이 쓰던 new 와 delete 에 대해서 소홀하게 넘어갔던 부분을 - 보고 정리를 하게 되었습니다. 저와 마찬가지로 많은 사람들이 'new operator' 와 'operator new'를 혼동하시는 것 같아서 - 간단히 정리해봤습니다. + bugmail 에게 More Effective C++을 빌려 보던 중 일반적으로 많이 쓰던 new 와 delete 에 대해 + 서 소홀하게 넘어갔던 부분을 보고 정리를 하게 되었습니다. 저와 마찬가지로 많은 사람들이 - 'new operator'는 C++ 에서 제공하는 연산으로 두 가지 동작을 수행합니다. + new operator 와 operator new - -- 먼저, 요청한 타입 크기의 메모리를 할당하고, 다음으로, 타입 인스턴스의 생성자를 호출하여 초기화를 수행합니다. + 를 혼동하시는 것 같아서 간단히 정리해봤습니다. - C++ 컴파일러는 'new operator'를 위의 내용처럼 코드로 만들어냅니다. 'operator new'란 바로 요청한 타입 크기의 메모리 - 를 할당하는 동작을 수행하는 Operator입니다. + new operator 는 C++ 에서 제공하는 연산으로 두 가지 동작을 수행합니다. - 따라서 위의 내용을 다시 요약하면, 'new operator'는 'operator new'로 메모리를 할당하고, object 의 생성자를 호출하는 - 동작을 한다." 라고 할 수 있습니다. + -- 먼저, 요청한 타입 크기의 메모리를 할당하고, 다음으로, + -- 타입 인스턴스의 생성자를 호출하여 초기화를 수행합니다. - 'operator new'는 Overload 될 수 있기 때문에 사용자가 자신만의 'operator new'를 정의할 수 있습니다. 또, 항상 void* - 를 리턴하고, 첫번째 인자로 size_t를 받습니다. 'new operator'의 문법은 다음과 같습니다. + C++ 컴파일러는 new operator 를 위의 내용처럼 코드로 만들어냅니다. operator new 란 바로 요 + 청한 타입 크기의 메모리를 할당하는 동작을 수행하는 Operator 입니다. + + 따라서 위의 내용을 다시 요약하면, new operator 는 + + operator new 로 메모리를 할당하고, object 의 생성자를 호출하는 동작을 한다. + + 라고 할 수 있습니다. + + operator new 는 Overload 될 수 있기 때문에 사용자가 자신만의 'operator new'를 정의할 수 + 있습니다. 또, 항상 void* 를 리턴하고, 첫번째 인자로 size_t 를 받습니다. new operator 의 + 문법은 다음과 같습니다. [::] new [placement] new-type-name [new-initializer] [::] new [placement] ( type-name ) [new-initializer] - placement - new 를 overload 할 때 추가로 인자를 전달하는 방법을 제공합니다. 예를 들어, 표준 C++ 라이브러리의 default new는 메 - 모리가 바닥나면 exception 을 throw합니다. Overload 된 new 는 대신 NULL을 리턴하는데, Overload 된 new 는 다음과 같 - 이 정의되어 있습니다. + new 를 overload 할 때 추가로 인자를 전달하는 방법을 제공합니다. 예를 들어, 표준 C++ 라이 + 브러리의 default new는 메모리가 바닥나면 exception 을 throw 합니다. Overload 된 new 는 대 + 신 NULL 을 리턴하는데, Overload 된 new 는 다음과 같이 정의되어 있습니다. struct nothrow_t {}; extern const nothrow_t nothrow; @@ -3835,22 +3843,23 @@ namespace ZNsCPP */ } - type-name - 할당할 타입을 명시합니다. type-name은 built-in 이거나 user-defined 타입일 수 있습니다. + 할당할 타입을 명시합니다. type-name 은 built-in 이거나 user-defined 타입일 수 있습니다. - initializer - 초기화할 object를 위한 값을 제공합니다. initializer 는 object 배열을 할당하기 위해서는 사용될 수 없습니다. 'new - operator'는 default 생성자를 가지고 있는 object 의 배열만을 생성할 수 있습니다. + 초기화할 object 를 위한 값을 제공합니다. initializer 는 object 배열을 할당하기 위해서는 + 사용될 수 없습니다. new operator 는 default 생성자를 가지고 있는 object 의 배열만을 생성 + 할 수 있습니다. - new 중에서 'Placement-new'는 메모리를 전혀 할당하지 않고, object 의 생성자를 호출하기 위해서만 사용됩니다. 'Placement-new' - 는 일반적으로 다음과 같이 정의되어 있습니다. + new 중에서 Placement-new 는 메모리를 전혀 할당하지 않고, object 의 생성자를 호출하기 위해 + 서만 사용됩니다. Placement-new 는 일반적으로 다음과 같이 정의되어 있습니다. inline void *operator new( size_t, void* p ) { return p; } - Automatic Variable을 제외한다면 'Placement-new'는 object 의 생성자를 호출할 수 있는 유일한 방법입니다. new 와 쌍( - Pair)인 delete도 이와 비슷합니다. + Automatic Variable 을 제외한다면 Placement-new 는 object 의 생성자를 호출할 수 있는 유일 + 한 방법입니다. new 와 쌍(Pair)인 delete도 이와 비슷합니다. 'delete operator'는 object 의 소멸자를 호출하고, 'operator delete'를 호출하여 메모리를 해제하는 동작을 수행합니다. @@ -3885,14 +3894,15 @@ namespace ZNsCPP */ http://kldp.org/node/76375 http://www.devx.com/tips/Tip/12756 -■ 어떤 클래스에 멤버변수를 추가하게 되면 생성자에서 초기화해야 하는지 한 번 더 생각하자. 생성자에서 초기화를 빠트려 - 서 애먹은 적이 있었다. +■ 어떤 클래스에 멤버변수를 추가하게 되면 생성자에서 초기화해야 하는지 한 번 더 생각하자. 생 + 성자에서 초기화를 빠트려서 애먹은 적이 있었다. -■ 클래스가 어떤 주기적인 상태를 가지는 경우, 한 주기가 끝날 때마다 내부 버퍼를 정확하게 초기화하자. 각 포탈이나 신 - 문사의 검색페이지에서 검색결과를 가져와 해석할 때, 각 검색페이지의 각 리스트 항목의 데이타 추출이 끝나면, 다음 리 - 스트 항목을 추출할 때 관련 버퍼를 초기화해 주어야 했는데 여기에 실수가 있어서, 추출시에 이전 정보가 자꾸 들러 붙었 - 다. 처음에는 이게 오류인 줄 알았고 들러붙은 것이 이전 정보인지도 몰랐다. 알고보니 다음 항목 추출 전에 관련 버퍼를 - 초기화 안한 실수였다. +■ 클래스가 어떤 주기적인 상태를 가지는 경우, 한 주기가 끝날 때마다 내부 버퍼를 정확하게 초 + 기화하자. 각 포탈이나 신문사의 검색페이지에서 검색결과를 가져와 해석할 때, 각 검색 페이지 + 의 각 리스트 항목의 데이타 추출이 끝나면, 다음 리스트 항목을 추출할 때 관련 버퍼를 초기화 + 해 주어야 했는데 여기에 실수가 있어서, 추출시에 이전 정보가 자꾸 들러 붙었다. 처음에는 이 + 게 오류인 줄 알았고 들러붙은 것이 이전 정보인지도 몰랐다. 알고보니 다음 항목 추출 전에 관 + 련 버퍼를 초기화 안한 실수였다. ■ 가상함수를 상속클래스에서 재정의할 때는 기본값 인수 갯수도 동일해야 한다.