티스토리 뷰
목차
C++ 메모리 해제 접근 할당 에러 (malloc, delete, free)
C++ 메모리 에러 종류
1. 메모리 해제 에러
메모리 릭
- 시간이 갈수록 메모리 사용량이 계속 증가한다. 시간이 갈수록 프로세스가 느리게 동작한다.
종국적으로 『메모리가 부족』하여 프로그램의 작업과 시스템 콜들이 실패한다.
1 2 3 4 5 6 | void memoryLeak() { int* p = new int[1000]; return; // 버그! p를 해제하지 않음 } | cs |
C++ 메모리 할당 해제 에러
메모리 할당, 해제의 잘못된 매칭
보통 프로그램을 즉시 크래시시키지 않는다. 어떤 플랫폼에서는 메모리를 손상할 수 있고 나중에 프로그램 크래시(세그먼테이션 오류)로 나타난다.
1 2 3 4 5 6 7 8 9 10 11 | void mismatchedFree() { int* p1 = (int*)malloc(sizeof(int)); int* p2 = new int; int* p3 = new int[1000]; delete p1; // 버그! free를 사용해야 함 delete p2; //버그! delete를 사용해야 함 free(p3); 버그! delete[] 를 사용해야 함 } | cs |
중복된 메모리 해제
두 delete 명령 중간에 다른 코드에서 해당 메모리를 할당받으면 중복 delete 후 그 메모리에 접근할 때 프로그램이 크래시(세그먼테이션 오류)된다.
1 2 3 4 5 6 7 8 | void doubleFree() { int* p1 = new int[1000]; delete[] p1; int* p2 = new int[1000]; delete[] p1; // 버그! p1을 두 번 해제했음 } | cs |
C++ 메모리 할당 해제 에러
할당되지 않은 메모리의 해제
보통 프로그램이 크래시(세그먼테이션 오류 또는 버스 에러)된다.
1 2 3 4 5 | void freeUnallocated() { int* p = reinterpret_cast<int*>(10000); delete p; // 버그! p는 유효한 포인터가 아님 } | cs |
스택 메모리의 해제
기술적으로 할당되지 않은 『메모리를 해제』하는 것과 같다. 보통 프로그램이 크래시된다.
1 2 3 4 5 6 | void freeStack() { int x; int* p = &x; delete p; // 버그! 스택 메모리를 해제함 } | cs |
위 문제의 대부분은 일반 포인터 대신 스마트 포인터를 사용함으로써 회피될 수 있다.
2. 메모리 접근 에러
에러 종류
잘못된 메모리 접근
대부분은 프로그램이 즉시 크래시 된다.
1 2 3 4 5 | void accessInvalid() { int* p = reinterpret_cast<int*>(10000); *p = 5 // 버그! p는 유효한 포인터가 아님 } | cs |
C++ 메모리 할당 해제 에러
해제된 메모리에 접근
보통 프로그램이 크래시되지 않는다. 만약 메모리가 다른 곳에 전달된 경우 예상치 못한 이상한 값이 나타날 수 있다.
1 2 3 4 5 6 7 8 9 10 | void accessFreed() { int* p1 = new int; delete p1; int* p2 = new int; delete p1; *p1 = 5; // 버그! p1에 의해 포인팅되는 메모리는 이미 해제되었음 } | cs |
C++ 메모리 할당 해제 에러
다른 곳에서 할당한 메모리에 접근
프로그램이 크래시되지는 않는다. 예상치 못한 이상한 값이 나타날 수 있다.
1 2 3 4 5 6 7 8 9 10 | void accessElsewhere() { int x, y[10], z; x = 0; z = 0; for (int i = 0; i <= 10; i++) { y[i] = 5; // 버그! 1 == 10에 해당하는 항목은 배열의 경계를 벗어남 } } | cs |
초기화되지 않은 메모리 읽기
초기화되지 않은 값을 잘못 이용하지 않는다면(ex: 포인터로서 역참조) 프로그램이 크래시되지는 않는다. 심지어 잘못 이용했는데도 크래시되지 않을 때가 있다.
1 2 3 4 5 | void readUninitialized() { int* p; cout << *p; // 버그! p는 초기화된 적이 없음 } | cs |
출처 : 전문가를 위한 C++ 2권, 1213~1215
C++ 메모리 해제 접근 할당 에러 (malloc, delete, free)