본문 바로가기

모던 C 언어/C언어 메모리관리6

3. C언어 레퍼런스 카운팅 방법의 한계 및 팁 들 본 포스트는 https://www.kernelpanic.kr/35와 https://www.kernelpanic.kr/36를 읽었다는 것은 전제로 작성되었다. 앞의 두 포스트를 먼저 읽고 오기를 바란다. 레퍼런스 카운팅 방법의 한계 레퍼런스 카운팅은 C언어에서 쉽고 효율적으로 메모리 관리를 할 수 있는 방법이다. 이 방법을 사용하면 대부분의 메모리 누수 관련 버그를 회피할 수 있지만 회피할 수 없는 누수도 있다. 순환참조(Circular Reference) 이슈이다. 순환참조는 둘 혹은 그 이상의 객체가 서로를 참조하는 상황이다. 예를 들자면 A 객체가 B 객체를 참조하고, B 객체가 A 객체를 참조하는 상황이다. 조금 꼬아본다면 A 객체가 B 객체를 참조하고, B 객체가 C 객체를 참조하는 상황에서 C .. 2021. 5. 21.
2. 메모리 누수 없는 C언어 프로그래밍 (3/3) - 레퍼런스 카운트 2부 이전 포스트들에서 다룬 규칙을 다시 한 번 더 확인해보자. (규칙1) 가능하다면 메모리 할당과 해제는 한 코드 블록 안에서 한 번만 (규칙2) 메모리 할당과 해제가 한 블록 이내에서 이뤄질 수 없다면 레퍼런스 카운트를 활용 이전 포스트에 이어지는 내용으로 이전 포스트를 읽지 않았다면 먼저 읽기를 강력히 권한다. ("2. 메모리 누수 없는 C언어 프로그래밍 (2/3) - 레퍼런스 카운트 1부" (www.kernelpanic.kr/35)) 이전 포스트에서는 규칙 2를 구현하는 간단한 방법에 대해서 살펴보았다. 이번 포스트에서는 앞에서 살펴본 구현의 취약점을 살펴보고 코드를 좀 더 정교하게 구현하는 방법에 대해서 살펴본다. 레퍼런스 카운트가 제대로 해제되지 않는 경우 앞서 우리는 레퍼런스 카운트(이하 rc)를.. 2021. 5. 13.
2. 메모리 누수 없는 C언어 프로그래밍 (2/3) - 레퍼런스 카운트 1부 앞선 포스트에서 C언어에서 메모리 누수를 피할 수 있는 두 가지 규칙을 소개하고, 규칙1 "가능하다면 메모리 할당과 해제는 한 코드 블록 안에서 한 번만"에 대해서 다뤘다. (www.kernelpanic.kr/34) 규칙1은 간단하고 강력하지만 규칙1을 적용할 수 없는 예외적인 상황들이 있다. 이 경우에 사용 가능한 방법이 규칙 2 "메모리 할당과 해제가 한 블록 이내에서 이뤄질 수 없다면 레퍼런스 카운터를 활용"이다. 이번 포스트에서는 어떤 경우에 규칙1을 적용할 수 없는지, 그리고 레퍼런스 카운터를 활용하는 방법에 대해서 다루도록 한다. (규칙1) 가능하다면 메모리 할당과 해제는 한 코드 블록 안에서 한 번만 (규칙2) 메모리 할당과 해제가 한 블록 이내에서 이뤄질 수 없다면 레퍼런스 카운트를 활용 .. 2021. 5. 5.
2. 메모리 누수 없는 C언어 프로그래밍 (1/3) - 메모리 할당과 해제는 한 블록에서 C언어에서 메모리 관리는 실력 여하를 막론하고 꽤나 골치아픈 주제이다. 프로그램 규모가 커지면 동적으로 할당된 메모리 개수가 늘어나게 되는데, 개발자도 사람인 이상 이처럼 할당된 메모리들의 생명주기를 하나도 빠짐없이 관리하는 것은 어렵기 때문이다. 따라서 C개발자들은 메모리 문제를 회피하기 위한 여러가지 테크닉들이 개발하였다. 이번 주제에서는 메모리 누수를 회피할 수 있는 두 가지 규칙과 몇 가지 테크닉들을 소개한다. 이 방법들을 모두 지킨다고 해서 메모리 누수 문제를 100%는 아니더라도 대부분의 메모리 누수 문제들을 피할 수 있다. 소개할 두 가지 규칙은 다음과 같다. 가능하다면 메모리 할당과 해제는 한 코드 블록 안에서 한 번만 메모리 할당과 해제가 한 블록 이내에서 이뤄질 수 없다면 레퍼런스 카운.. 2021. 4. 28.
1. C언어 메모리 관리의 어려움 (2/2) - C언어 메모리 문제 유형들 본 포스트에서는 C언어에서 쉽게 겪을 수 있는 메모리 문제들의 유형을 다룬다. 만약 C언어 메모리 구조에 대해서 잘 알지 못한다면, 앞선 포스트(www.kernelpanic.kr/32)를 먼저 보고오자. C언어 메모리 구조 및 어떤 종류의 메모리 문제 유형들이 있는지 잘 안다면 다음 포스트(www.kernelpanic.kr/34)로 넘어가면 된다. 이번 주제에서 C의 모든 메모리 문제를 해결할 수 있는 솔루션을 제시하지는 않는다. 그럴수도 없다. 다만 메모리 릭과 댕글링 포인터 이슈를 회피하는 테크닉에 대해서 다룰 예정이다. 따라서 메모리 릭과 댕글링 포인터 문제 유형에 대해서 확인하고 가면 된다. 1.2.1 메모리 릭(Memory Leak) 메모리 릭은 프로그램이 불필요한 메모리를 계속 점유하는 현상이.. 2021. 4. 28.
1. C언어 메모리 관리의 어려움 (1/2) - C언어 메모리 구조 포인터는 C언어의 가장 큰 강점이자 우리를 늘 메모리 관련 문제로 괴롭히는 큰 위험요인이다. 많은 좋은 프로그램들이 C언어의 포인터 기교를 사용해서 엄청난 메모리 / 성능상의 이득을 얻었다. 몇년도 전이지만, 아직도 리눅스 커널과 리눅스의 tcp/ip 스택에서 C언어 포인터를 활용한 것을 처음 봤을때의 신선한 충격이 생생하다. 훌륭한 프로그래밍 언어들이 많이 나왔지만 여전히 C의 포인터만큼 HW 직관적이고 강력한 개념은 없는 것 같다. 그러나 동시에 포인터는 원인을 찾기 어려운 버그들을 만들어 내곤 한다. 특히 어떤 버그들은 원인을 찾고서도 고치기가 몹시 난해한 경우들도 있다. 이는 훌륭한 프로그램에서도 예외가 아니다. 모질라 재단은 파이어폭스의 메모리 누수 문제로 수 년간 씨름하다가 결국 C++로 개발.. 2021. 4. 27.