티스토리 뷰

Programming/C++

C++ - 메모리 생성

글그리 2017. 12. 30. 17:11

개요


C++은 최근 나오는 언어들과 다르게 메모리를 직접 관리하는 언어이다. 따라서 동적으로 메모리를 할당하거나 해제할 때 주의하지 않으면 메모리 누수가 발생하거나 프로그램이 동작 중에 죽어버리는 현상 등을 보게된다.

메모리를 생성하거나 해제할 때 할 수 있는 실수 들을 알아보고 이 때 발생하는 오류 및 예외처리에 대해 알아보자.






생성


메모리를 동적으로 할당하는 것으로 표적으로 new 연산자가 있다. malloc() calloc 등도 있지만 C++언어로 한정하여 설명하기 위해 new만 언급하도록 하겠다.

기본적으로 new를 실패하는 경우는 어플리케이션이 더이상 메모리를 동적으로 할당할 수 없는 경우가 있다. 이 때 옛날 C++의 경우 NULL을 반환하도록 구현되어있어서 프로그래머가 NULL 체크를 통해 생성에 실패했는지 성공했는지 판단할 수 있었지만 new에 예외처리 루틴이 생기면서 더이상 NULL을 반환하지 않는다.

절대 안되는건 아니고 특정 명령을 사용해서 NULL을 반환하도록 할 수도 있다.


std::nothrow

메모리 생성이 실패하면 예외를 던지지 않고 NULL을 반환하도록 한다.

void main()
{
ClassA* a = new(std::nothrow) ClassA();

if(a == nullptr)
return;

a->foo();
}




try catch로 예외처리

new는 메모리 할당 실패시 bad_allocation 예외를 던지기 때문에 이것을 catch하여 처리할 수 있다.

void main()
{
try
{
ClassA* a = new ClassA();
}
catch(std::bad_allocation& ba)
{
return;
}
}




new handler로 예외처리

C++의 new는 기본적으로 new handler에 의해 처리되도록 구현되어있다. new handler는 메모리 생성에 실패했을 때 호출되는 함수이며 함수가 끝나면 new가 실패한 부분부터 다시 프로그램을 실행한다.

default new handler는 bad_allocation 예외를 던지도록 구현되어 있으며 프로그래머가 임의로 handler를 지정해서 사용할 수도 있다.

msdn에 따르면 new_handler가 반드시 수행해야 하는 일은 다음과 같다.

  • 메모리를 추가로 확보한다.

  • 프로세스를 종료한다.

  • 예외를 던진다.


void Handle()
{
std::cout<<"allocation error"<<endl;
ExitProcess(false);
return;
}

void main()
{
std::set_new_handler(Handle);
// ...
}






마치며


메모리 생성은 마법처럼 사용하고 있던 부분이지만 오류가 났을 때 적절히 처리할 수 있는 코드를 작성하지 않으면 불시에 프로그램이 죽어버릴 수 있다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함