Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

Pure Software Engineer :)

[항목49] new 처리자의 동작 원리를 제대로 이해하자 본문

Software Engineering/Programming

[항목49] new 처리자의 동작 원리를 제대로 이해하자

HelloJaewon 2013. 7. 20. 12:00

먼저 본 항목에 들어가기 앞서,

 

C++은 자바와 닷넷과는 다르게 메모리를 직접 관리해야 한다. 수동으로!!

 

하지만 반대로 생각해보면 개발자가 메모리를 잘(?) 컨트롤 할수만 있다면, 가비지 컬렉터를 통해 메모리 관리에 신경쓰지 않아도 되는 언어와 달리 성능(시간, 공간) 향상을 누릴 수가 있다.

 

C++의 메모리를 직접 관리하기 위해서는 C++에서 메모리 관리 루틴이 어떻게 동작하는지를 잘 알아둘 필요가 있으며,

그에 대한 내용을 이번항목에서 설명하고 있다.

 

[항목49] new 처리자의 동작 원리를 제대로 이해하자

 

C++에서는 흔히 operator new 연산자를 통해 메모리 할당을 요청한다. 하지만 메모리 할당에 실패하였을 경우에는?

 

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cstdlib>
 
int main (void) {
    int * arr = new int[10];
    if (!arr)
        std::abort();
        
    delete[] arr;
    
    return 0;
}

 

위와 같이 배열을 위한 메모리 할당을 실패한경우 NULL 인지 검사하는 코드를 사용하지 않은가?

나만 그런지 모르겠는데...예전 컴파일러는 NULL을 반환 했지만 요즘 컴파일러는 메모리 할당이 실패할경우 예외를 던진다고 한다. 결국 NULL 검사를 하는 코드는 요즘의 컴파일러에서는 불필요한 코드라고 할 수 있겠다.

 

C++ 은 메모리 할당이 실패하였을 경우 operator new 가 예외를 던지기 전에, 사용자가 지정할 수 있는 에러 처리 함수를 우선적으로 호출하게 되어 있다. 이 함수를 가리켜 new 처리자라고 한다. 이를 위해 표준 라이브러리에는 set_new_handler 라는 함수가 준비되어 있으며, 헤더는 <new> 이다.

 

1
2
3
4
5
namespace std {
    typedef void (*new_handler) ();
    
    new_handler set_new_handler (new_handler p) throw ();
}

 

set_new_handler를 보면 반환값이 new_handler인데 이는 이전에 new 처리자로 쓰이던 함수 포인터이다.

따라서, 이 포인터를 남겨두었다가, 사용자가 어떠한 처리를 먼저 하고 난 후에 다시 이전 new 처리자로 set_new_handler 함수를 통해 지정함으로써 기존 new 처리자도 실행되도록 할 수 있다.

선언문 끝에 있는 throw() 는 예외 지정 이라고 해서, 이 함수가 어떤 예외도 던지지 않을 것이라는 의미이다.