동적 버퍼 관리 시스템

C 예제

중급 난이도
예제 타입
11/01 등록일

동적 버퍼 관리 시스템

중급
태그
동적 할당 버퍼 관리 메모리 최적화 실시간 처리 오류 처리
## 프로젝트 개요
실시간 데이터 처리 시나리오에서 메모리 누수를 방지하고 유연한 크기 조절이 필요한 동적 버퍼 관리를 구현합니다. 사용자 입력에 따라 버퍼 크기를 자동 조정하며, 메모리 누수 방지를 위한 정확한 할당/해제 처리를 핵심으로 합니다.

## 주요 기능
- 실시간 데이터 입력 시 버퍼 동적 확장
- 최대 메모리 한도 설정 및 경고 시스템
- 오류 발생 시 자동 복구 모드 진입
- 사용자 친화적인 메모리 사용량 표시

## 사용 방법
1. 프로그램 실행 후 'i' 입력으로 데이터 입력
2. 'q' 입력으로 종료 및 메모리 해제
3. 'm' 입력으로 현재 할당된 메모리 크기 확인
4. 오류 발생 시 자동 복구 모드 진입

## 확장 가능성
- 스레드 안전성 추가
- 메모리 사용량 로깅 기능 구현
- 여러 버퍼 동시 관리 시스템 확장
코드 예제
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BUFFER_SIZE 1024 * 1024 // 최대 메모리 한도 (1MB)
#define ERROR_MESSAGE "메모리 할당 실패: 프로그램 종료"

typedef struct {
    char* buffer;
    size_t capacity;
    size_t used_size;
} DynamicBuffer;

// 버퍼 초기화 함수
DynamicBuffer init_buffer(size_t initial_size) {
    DynamicBuffer db = {
        .buffer = (char*)malloc(initial_size),
        .capacity = initial_size,
        .used_size = 0
    };
    
    if (!db.buffer) {
        fprintf(stderr, "[%s] %s
", __func__, ERROR_MESSAGE);
        exit(EXIT_FAILURE);
    }
    return db;
}

// 버퍼 확장 함수
void resize_buffer(DynamicBuffer* db, size_t new_size) {
    if (new_size > MAX_BUFFER_SIZE) {
        fprintf(stderr, "[%s] %s
", __func__, ERROR_MESSAGE);
        exit(EXIT_FAILURE);
    }
    
    char* new_buffer = (char*)realloc(db->buffer, new_size);
    if (!new_buffer) {
        fprintf(stderr, "[%s] %s
", __func__, ERROR

    } else {
        db->buffer = new_buffer;
        db->capacity = new_size;
    }
}

// 버퍼 입력 함수
void buffer_input(DynamicBuffer* db) {
    char input[1024];
    printf("
입력 (q: 종료, m: 메모리 확인): ");
    scanf("%s", input);
    
    if (strcmp(input, "q") == 0) return;
    if (strcmp(input, "m") == 0) {
        printf("
현재 할당 크기: %zu KB
", db->capacity / 1024);
        return;
    }
    
    // 입력 데이터 복사
    size_t input_len = strlen(input);
    if (db->used_size + input_len > db->capacity) {
        resize_buffer(db, db->capacity * 2);
    }
    strcpy(db->buffer + db->used_size, input);
    db->used_size += input_len;
}

int main() {
    DynamicBuffer db = init_buffer(1024);
    
    printf("
=== 동적 버퍼 관리 시스템 ===
");
    while (1) {
        buffer_input(&db);
        if (strcmp(input, "q") == 0) break;
    }
    
    // 메모리 해제
    free(db.buffer);
    printf("
=== 프로그램 종료 ===
");
    return 0;
}
등록일: 2025년 11월 01일 02:36
언어 정보
언어
C
카테고리
General
인기도
#5
학습 팁
코드를 직접 실행해보세요
변수를 바꿔가며 실험해보세요
오류가 나도 포기하지 마세요
다른 예제도 찾아보세요