티스토리 뷰
개요
C++은 최근 나오는 언어들과 다르게 메모리를 직접 관리하는 언어이다. 따라서 동적으로 메모리를 할당하거나 해제할 때 주의하지 않으면 메모리 누수가 발생하거나 프로그램이 동작 중에 죽어버리는 현상 등을 보게된다.
메모리를 생성하거나 해제할 때 할 수 있는 실수 들을 알아보고 이 때 발생하는 오류 및 예외처리에 대해 알아보자.
생성
메모리를 동적으로 할당하는 것으로 표적으로 new 연산자가 있다. malloc() calloc 등도 있지만 C++언어로 한정하여 설명하기 위해 new만 언급하도록 하겠다.
기본적으로 new를 실패하는 경우는 어플리케이션이 더이상 메모리를 동적으로 할당할 수 없는 경우가 있다. 이 때 옛날 C++의 경우 NULL을 반환하도록 구현되어있어서 프로그래머가 NULL 체크를 통해 생성에 실패했는지 성공했는지 판단할 수 있었지만 new에 예외처리 루틴이 생기면서 더이상 NULL을 반환하지 않는다.
절대 안되는건 아니고 특정 명령을 사용해서 NULL을 반환하도록 할 수도 있다.
std::nothrow
메모리 생성이 실패하면 예외를 던지지 않고 NULL을 반환하도록 한다.
void main() |
try catch로 예외처리
new는 메모리 할당 실패시 bad_allocation 예외를 던지기 때문에 이것을 catch하여 처리할 수 있다.
void main() |
new handler로 예외처리
C++의 new는 기본적으로 new handler에 의해 처리되도록 구현되어있다. new handler는 메모리 생성에 실패했을 때 호출되는 함수이며 함수가 끝나면 new가 실패한 부분부터 다시 프로그램을 실행한다.
default new handler는 bad_allocation 예외를 던지도록 구현되어 있으며 프로그래머가 임의로 handler를 지정해서 사용할 수도 있다.
msdn에 따르면 new_handler가 반드시 수행해야 하는 일은 다음과 같다.
메모리를 추가로 확보한다.
프로세스를 종료한다.
예외를 던진다.
void Handle() |
마치며
메모리 생성은 마법처럼 사용하고 있던 부분이지만 오류가 났을 때 적절히 처리할 수 있는 코드를 작성하지 않으면 불시에 프로그램이 죽어버릴 수 있다.
'Programming > C++' 카테고리의 다른 글
C++ - 클래스 관계 용어 정리 (0) | 2018.03.02 |
---|---|
C++ - 메모리 해제 (0) | 2017.12.30 |
c++11 - std::shared_ptr로 thread safe callback 구현하기 (0) | 2017.11.19 |
C++11 - std::bind (0) | 2017.09.21 |
콜백함수 만들기 : 함수 포인터(Function Pointer) (0) | 2017.02.05 |
- Total
- Today
- Yesterday
- 드라마
- C++
- OS
- game
- 운영체제
- SHADER
- DesignPattern
- C/C++
- 자료구조
- machine learing
- 수학
- SwiftUI
- SOCKET
- 데이터베이스
- rxswift
- winsock
- ue4
- swift
- JSP
- Git
- C
- scala
- Spring
- 알고리즘
- ios
- 국내여행
- database
- Cocos2d-x
- mongoDB
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |