동적 메모리의 소유권 문제
메모리에서 소유권 문제는 어떤 의미일까요?
바로 이미 할당된 메모리를 누가 해제를 해줘야 하는지에 관한 문제입니다.
해제는 꼭 소유주가 동적으로 할당한 메모리를 책임지고 해제로 마무리해야 합니다.
비소유자가 해제해도 문제입니다. 그럼 소유주란 누구일까요?
바로, 메모리를 생성한 함수입니다.
실제로 아래 함수을 호출 시 생기는 문제는
호출자가 이 함수를 호출할 때 함수 내부에서 새 메모리가 할당하여 반환한다는 사실을 어떻게 알아낼 수 있습니까?
const char* combine_string(const char* a, const char* b) { void* str; char* p; /* a와 b의 길이 및 두 길이를 더한 값을 보관한 변수 생략 */ str = malloc(size); /* a와 b를 str에 복사하는 코드 생략*/ return str; } result = combine_string("Hello","World"); |
C++ 에서는 RAII로 해결합니다.
RAII은 Resource Acquisitio Is Initialization의 약자로 '자원(메모리) 획득은 초기화'라는 뜻입니다.
C++은 개체지향 언매니지드 언어인데,
한 개체가 생성될 때 필요한 메모리를 할당할 수 있는 '생성자'라는 함수가 있고,
그 개체의 수명이 다할 때 그 메모리를 직접 해제하는 '소멸자'라는 함수도 있습니다.
즉, 개체의 수명이라는 범위에 메모리의 수명을 종속시켰기 때문에 원칙을 잘 따르면 실수한 여지가 적습니다.
그럼 C는요?
일단 C에는 개체 개념이 없습니다.
그래서 C에서는 한 함수 안에 malloc(), free()를 다 호출해야 합니다.
메모리 사용과 관련하여
베스트 프랙틱스(Best practice)로는 다음과 같은 것들이 있습니다.
1 malloc() 작성한 뒤에 곧바로 free()도 추가하자
2 동적 할당을 한 메모리 주소를 저장하는 포인터 변수와 포인터 연산에 사용하는 포인터 변수를 분리해 사용하자
(원래 포인터 변수를 사용할 경우, 주소를 잃어버려서 해제를 못할 수 있기 때문)
4 메모리 해제 후, 널 포인터 대입하자
5 정적 메모리 우선으로 사용하고 어쩔 수 없을 때만 동적 메모리를 사용하자
6 동적 메모리 할당을 할 경우, 변수와 함수 이름에 그 사실을 알리자
-----------------------------------
-----------------------------------
'컴퓨터 공학 > C, C++' 카테고리의 다른 글
[ C ] 포인터 이해하기2_참조와 역참조/ 역 참조 연산자 * (611) | 2020.07.18 |
---|---|
[ C ] 포인터 이해하기1_포인터 변수란?/선언 방법 / & 연산자 (393) | 2020.07.17 |
[ C ] 메모리 이해하기10 _정적 vs 동적 메모리 (398) | 2020.07.17 |
[ C ] 메모리 이해하기9 _realloc()의 메모리 누수 문제, 해결책은? (398) | 2020.07.16 |
[ C ] 메모리 이해하기8 _calloc(), memset(), realloc() (411) | 2020.07.16 |
댓글