본문 바로가기

메모리릭3

2. 메모리 누수 없는 C언어 프로그래밍 (3/3) - 레퍼런스 카운트 2부 이전 포스트들에서 다룬 규칙을 다시 한 번 더 확인해보자. (규칙1) 가능하다면 메모리 할당과 해제는 한 코드 블록 안에서 한 번만 (규칙2) 메모리 할당과 해제가 한 블록 이내에서 이뤄질 수 없다면 레퍼런스 카운트를 활용 이전 포스트에 이어지는 내용으로 이전 포스트를 읽지 않았다면 먼저 읽기를 강력히 권한다. ("2. 메모리 누수 없는 C언어 프로그래밍 (2/3) - 레퍼런스 카운트 1부" (www.kernelpanic.kr/35)) 이전 포스트에서는 규칙 2를 구현하는 간단한 방법에 대해서 살펴보았다. 이번 포스트에서는 앞에서 살펴본 구현의 취약점을 살펴보고 코드를 좀 더 정교하게 구현하는 방법에 대해서 살펴본다. 레퍼런스 카운트가 제대로 해제되지 않는 경우 앞서 우리는 레퍼런스 카운트(이하 rc)를.. 2021. 5. 13.
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.