본문 바로가기
컴퓨터 공학/C, C++

[ C ] 메모리 이해하기11_동적 메모리의 소유권 문제

by hahehohoo 2020. 7. 17.
반응형

동적 메모리의 소유권 문제

 

메모리에서 소유권 문제는 어떤 의미일까요?

바로 이미 할당된 메모리를 누가 해제를 해줘야 하는지에 관한 문제입니다.

 

해제는 꼭 소유주가 동적으로 할당한 메모리를 책임지고 해제로 마무리해야 합니다.

비소유자가 해제해도 문제입니다.  그럼 소유주란 누구일까요?

바로, 메모리를 생성한 함수입니다. 

 

실제로 아래 함수을 호출 시 생기는 문제는

호출자가 이 함수를 호출할 때 함수 내부에서 새 메모리가 할당하여 반환한다는 사실을 어떻게 알아낼 수 있습니까?

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언어 문법 총정리

목록 보러가기 

-----------------------------------

 

 

반응형


댓글