반응형

우선 제가 운영하고 있는 VoIP 서비스에 미디어 쪽 엔진에서 재생 관련하여 구현하며 이중 포인터를 접했고,

메모리 누수가 발생하였으며(Linked List (연결 리스트) 메모리 누수),

메모리 누수 해결을 위한 포스팅까지(_CrtDumpMemoryLeaks 을 이용한 메모리 누수 확인)...

포스팅이 계속 이어지는 것 같습니다.

그럼 앞서 포스팅했던 내용들을 토대로 버그 재발을 막기 위해 C언어 이중 포인터에 대한 malloc/free를 자세히 살펴보도록 하겠습니다.

우선 포인터는 배열과는 다르게 동적으로 메모리를 할당하는 녀석입니다.

기본적인 변수 타입의 사이즈 말고는 따로 malloc으로 메모리를 할당해주지 않으면 안 된다는 말입니다.

 

 


1. 우선 다음 기본 함수를 사용하기 위한 헤더가 필요합니다.

#include <stdlib.h>
void* malloc(size_t size);


2. 변수 선언

  • 이중 포인터 변수를 선언합니다
    • char **p_playlist;


3. 이중 포인터에 대한 메모리 할당

  • 이차원 배열을 생각하면 쉬울 것 같습니다.
    • p_playlist = (char**) malloc(sizeof(char*) * play_cnt);
      -> 이차원 배열중에 첫 번째 배열에 대한 메모리를 할당
    • for(i=0; i <play_cnt; i++) p_playlist [i] = (char*) malloc (sizeof (char) * 256);
      -> 이차원 배열중에 두 번째 배열에 대한 메모리를 할당

 


4. 버퍼에 스트링 어싸인

  • p_playlist에 임시로 스트링을 삽입하여 줍니다.(서비스에선 이렇게 하면 안 되겠지요?)
  • strcpy를 사용하기 위해선 다음 헤더도 선언해줘야 합니다
    • #include <string.h>


5. 메모리 해제

  • 서비스 운영 중 실수하여 며칠을 고생했던 부분이네요.
  • for(i=0; i <play_cnt; i++) free(p_playlist [i]);
    -> 이차원 배열중 두 번째 배열에 대한 메모리를 해제하는 부분
  • free(p_playlist);
    -> 이차원 배열중 첫 번째 배열에 대한 메모리를 해제하는 부분
    -> playlist의 껍데기 메모리를 해제하는 부분이라고 생각하면 됨


전체 소스코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char **p_playlist;
    int i;
    int play_cnt = 5;

    p_playlist = (char**) malloc(sizeof(char*) * play_cnt);
    for(i=0; i<play_cnt; i++) {
		p_playlist[i] = (char*)malloc(sizeof(char)*256);
	}

    strcpy(p_playlist[0], "TEST playlist 0");
    strcpy(p_playlist[1], "TEST playlist 1");
    strcpy(p_playlist[2], "TEST playlist 2");
    strcpy(p_playlist[3], "TEST playlist 3");
    strcpy(p_playlist[4], "TEST playlist 4");

    for(i=0; i<play_cnt; i++) {
        printf("playlist [ %d ] : %s\n", i, p_playlist[i]);
        free(p_playlist[i]);
    }
    free(p_playlist);
    return 0;
}

정리

포인터는 배열과 메모리 할당 방식이 다를 뿐 배열의 연장선이라고 봅니다.

원하는 크기만큼 버퍼의 사이즈를 잡고, 그 사이즈 안에서 버퍼를 사용하고, 최종적으로 버퍼를 비워줍니다.

예제를 할때는 느끼지 못하겠지만, 대규모 서비스에서 malloc/free를 경험해본다면 정말 작은 것부터 해나가야 한다는 것을 느꼈습니다.

 

누군가에겐 도움이 되었기를.........

반응형
블로그 이미지

yesnomark

이것저것 개발하며 애매하게 경력쌓고 있는 중니어 개발자

,
반응형

개발 진행중에 있는 프로젝트로 차후 변경될 수 있습니다


1. 프로젝트

- 3차원 지중관로 측량시스템


2. 용도

- 맨홀과 맨홀 사이 관로의 형상을 추정하여, 지하매설물의 위치 좌표 및 심도에 대한 잘못된 정보로 발생할 수 있는 각족 안전사고를 사전에 예방




3. 역할

- F/W, Embedded

- 방대한 센서(각도, 지자계) 데이터 제어처리


4. 사용언어, 개발환경 및 기술

- Raspberry-pi3 / C / C++ / Linux Device Driver / Kernel Module / Qt Creator / SQLite / RS-485통신




측량 방법




[30M Prototype]


개발 예정인 프로토타입 도식화

- Node 1개당 필요한 데이터 9개(각도 센서 3개 + 자이로 센서 3축 2개) x 50개(Node갯수) x 2개(중계기 갯수)를 관리

- 중계기 / Node 의 전원 상태 및 On/Off 정보 통합관리

- Kernel module 


반응형
블로그 이미지

yesnomark

이것저것 개발하며 애매하게 경력쌓고 있는 중니어 개발자

,
반응형

1. 프로젝트

- LibJPEG 오픈소스 Memory Manager


2. 용도

- 이미지 프로세싱

- 효율적인 메모리 관리를 위한 Open Source(LibJPEG) 부분 포팅


3. 역할

- 이미지 Encoding/Decoding 퍼포먼스 향상을 위한 효율적인 메모리 관리


4. 사용언어, 개발환경 및 기술

- Visual Studio / C / C++ / Image Compression / Data-Structure / Linked-list /













반응형
블로그 이미지

yesnomark

이것저것 개발하며 애매하게 경력쌓고 있는 중니어 개발자

,
반응형

1. 프로젝트

- JPEG Multi-thread Block Decoding


2. 용도

- Multi-thread 를 이용한 이미지 Decoding 속도 개선 및 메모리 최적화


3. 역할

- 이미지 해상도에 따라 Block count, Thread, Circular queue 의 갯수를 조절하여 퍼포먼스 향상


4. 사용언어, 개발환경 및 기술

- Visual studio / c / c++ / image compression / huffman / DCT / color conversion /



▶ 1. Block Count : 이미지의 픽셀을 몇 개로 디코딩 할 지 크기 설정

▶ 2. Thread Count : 메인 스레드와 몇 개의 서브 스레드로 이미지의 Block Count 를 디코딩 할 지 크기 설정

▶ 3. Queue Count : 스레드의 갯수만큼 할 지 크기 설정

결국 이미지의 해상도에 따라 1~3이 최적화인 시점을 찾는다



반응형
블로그 이미지

yesnomark

이것저것 개발하며 애매하게 경력쌓고 있는 중니어 개발자

,
반응형

1. 프로젝트

- 자기마커 탐지기


2. 용도

- 지중 관로의 자기마커(자기장센서)를 어느 위치에서 어느 깊이 만큼 시공했는지 탐지하기 위한 기구


3. 역할

- F/W, Embedded

- UART, I2C, SPI 통신을 통한 지자계, 자이로 센서, 블루투스, Flash memory, 사운드, 배터리 데이터 제어

- SW(Tablet/UMPC) 단과 프로토콜로 상호작용 및 통신하여 실시간으로 데이터 송/수신


4. 사용언어, 개발환경 및 기술

- IAR / STM32F4xx library / Atmega328p / Arduino / CodeVisionAVR / c / UART Serial / I2C / SPI / PWM / ADC / Bluetooth





센서 (Magnetic, Gyro), Sound, Battery, Power On/Off 에 대한 데이터를 Tablet 혹은 UMPC 에 송/수신






메인보드 (STM32F4xx) Class Diagram







메인보드 (STM32F4xx) Flow Chart






반응형
블로그 이미지

yesnomark

이것저것 개발하며 애매하게 경력쌓고 있는 중니어 개발자

,