질문의 역사:
C++에서 메모리 작업은 근본적인 요소로, 언어는 효율성을 위해 프로그래머에게 완전한 제어를 제공합니다. 처음에는 "스택"과 "힙"이라는 개념만 존재했으며, 이는 동적 및 자동 메모리 할당 영역으로 사용됩니다.
문제:
변수가 위치하는 영역의 선택은 그 수명, 접근 가능성, 메모리 할당 및 해제 속도, 그리고 위험(메모리 누수, 스택 손상, 조각화)을 결정합니다.
해결책:
스택 할당은 알려진 수명 동안의 지역 변수를 위해 사용됩니다. 힙 할당은 동적 수명이 필요하거나 큰 메모리 용량이 필요한 객체를 위해 사용됩니다. 수동적인 힙 관리의 최소화를 권장하며, 스택을 선호하고 동적 메모리 작업을 위해 스마트 포인터를 사용하는 것이 좋습니다.
코드 예시:
// 스택 할당 int a = 5; // 힙 할당 int* b = new int(10); // 스마트 포인터 작업 #include <memory> auto ptr = std::make_unique<int>(15);
함수에서 지역 변수에 대한 포인터를 반환하면 어떻게 됩니까?
정의되지 않은 동작이 발생합니다: 함수가 종료된 후 메모리가 "해제"되며(실제로 스택이 청소되지는 않지만 데이터는 덮어써질 수 있습니다).
잘못된 코드 예시:
int* foo() { int a = 42; return &a; // 잘못됨! }
스택에서 할당된 메모리가 누수될 수 있습니까?
아니요, 스택 메모리는 항상 가시 영역에서 나올 때 자동으로 해제됩니다 — 스택 오버플로우는 발생할 수 있지만 메모리 누수는 아닙니다.
동적 메모리를 해제하기 위해 항상 delete를 사용할 수 있습니까?
아니요, 훨씬 더 자주 스마트 포인터(std::unique_ptr, std::shared_ptr)를 사용하여 잊힌 delete 및 이중 삭제를 피합니다.
부정적 사례:
개발자가 모든 임시 객체에 대해 new를 사용하고 해제를 잊어버림 — 시간이 지남에 따라 큰 애플리케이션에서 메모리 누수가 발생했습니다.
장점: 처음에는 빠르고 편리함. 단점: 불안정한 프로그램, 메모리 증가, 다운.
긍정적 사례:
지역 변수와 스마트 포인터를 사용하여 임시 및 보조 객체를 처리함. 명시적 delete가 없으며, 모든 것이 자동으로 해제됩니다.
장점: 메모리 누수 없음, 신뢰성. 단점: 현대적인 메모리 작업 접근 방식을 이해해야 함.