C++ 오류·메모리·디버깅
C++에서 자주 만나는 컴파일 에러와 링커 에러(undefined reference, multiple definition, LNK2019), 세그멘테이션 폴트, 스택 오버플로우, 힙 손상의 원인을 찾는 순서를 정리합니다. 에러 메시지를 읽는 법과 원인 후보를 좁히는 기준을 중심으로 합니다.
메모리 누수는 Valgrind·AddressSanitizer·Heaptrack으로, 데이터 레이스는 ThreadSanitizer로 찾는 과정을 예제와 함께 다룹니다. 정적 초기화 순서, ODR, 이름 맹글링처럼 빌드와 링크 단계에서 생기는 문제도 포함합니다.
처음 읽기 좋은 글
- C++ Segmentation fault 원인 5가지와 디버깅 방법 | GDB로 추적하기
- 디버그에선 되고 릴리스에서 죽는 코드: C++ 미정의 동작 15가지 패턴과 UBSan
- C++ 메모리 누수 심화 디버깅 | 힙 프로파일링·패턴·스마트포인터·순환참조·프로덕션
전체 글 42편
각 글에 표시된 난이도를 기준으로 초급, 중급, 고급 순으로 나눴습니다. 처음이라면 위쪽부터 읽고, 이미 아는 단계는 건너뛰어도 됩니다.
초급 (8편)
- 프로그래밍 언어별 흔한 에러 해결 가이드 | C++, Python, Java, JavaScript
- C++ 범위 기반 for문 no begin function 에러: 내부 변환과 커스텀 컨테이너 begin·end
- C++ 초보자가 자주 하는 실수 Top 15 | 컴파일 에러부터 런타임 크래시까지
- C++ 컴파일 오류 해결 가이드 | 초보자가 자주 겪는 10가지 에러
- C++ const 에러: passing as const 컴파일 에러 원인과 const 정합성
- C++ include 에러 No such file or directory: 헤더 경로·대소문자·순환 include 해결
- C++ multiple definition 링커 에러: 헤더 정의 중복의 원인과 해결
- CMake Error 자주 나는 10가지: find_package 실패·target not found·캐시 오염 해결
중급 (28편)
- 디버그에선 되고 릴리스에서 죽는 코드: C++ 미정의 동작 15가지 패턴과 UBSan
- ASan과 TSan으로 런타임 버그 잡기: 메모리 오류·데이터 레이스 예제와 CI 통합
- C++ 가상 소멸자가 없을 때 생기는 누수: virtual·protected 소멸자 선택 기준
- C++ 객체 슬라이싱 에러: vector<Base>에 담을 때 잘리는 이유와 clone 패턴
- C++ 동적 초기화와 정적 초기화 순서 문제: Meyers 싱글톤·constinit으로 해결하기
- C++ 람다 캡처로 생기는 dangling reference: 값 캡처·shared_ptr·[*this]로 수명 지키기
- C++ 링커 에러 심화 가이드 — 심볼 해석·약한 심볼·SIOF·중복 진단
- C++ 멀티스레드 간헐적 크래시: ThreadSanitizer로 데이터 레이스 찾고 mutex·atomic으로 고치기
- C++ 메모리 누수 찾기: Valgrind·ASan·CRT 디버그 힙 사용법과 누수 패턴
- C++ 반복자 무효화: vector iterators incompatible 크래시 원인과 해결
- C++ 버퍼 오버플로우: strcpy·오프바이원 실수가 생기는 원리와 방지·탐지 방법
- C++ 스택 오버플로우 크래시: 깊은 재귀·큰 지역 배열 진단과 스택 크기 조정
- C++ 이름 은닉(Name Hiding): 파생 클래스에서 기반 오버로드가 안 보일 때 using 선언
- C++ 정적 초기화 순서 문제(Static Initialization Order Fiasco): 재현과 함수 내 static·constinit 해결
- C++ 템플릿 에러 메시지 읽는 법: 첫 줄·note·candidate 순서와 자주 나오는 패턴
- C++ 헤더 온리 라이브러리 만들기: inline·템플릿·constexpr과 ODR, multiple definition 피하기
- C++ 힙 손상: 버퍼 오버플로우·이중 delete·use-after-free 원인과 ASan·Valgrind 탐지
- C++ auto 타입 추론 실수: 참조·const가 떨어지는 복사, vector<bool> 프록시, 중괄호 추론
- C++ CMake 링크 에러 LNK2019 | 원인과 해결
- C++ ODR(단일 정의 규칙): 헤더 정의 링크 에러, inline·템플릿 예외, 링커가 못 잡는 위반
- C++ RVO와 NRVO: C++17 보장 복사 생략과 return std::move가 NRVO를 막는 경우
- C++ Segmentation fault 원인 5가지와 디버깅 방법 | GDB로 추적하기
- C++ shared_ptr 순환 참조 누수: weak_ptr로 끊는 기준과 디버깅 방법
- C++ undefined reference to vtable: 첫 비인라인 가상 함수 정의 누락과 해결
- C++ use-after-move 버그: std::move가 캐스팅일 뿐인 이유와 이동 의미론 실수 10가지
- CMake 3.28+ 프리셋과 모듈로 크로스 플랫폼 빌드 구성하기
- CMake 에러 해결: 컴파일러·find_package·링커·캐시 문제를 단계별로 좁히는 법
- CMake find_package로 외부 라이브러리 연결하기: Config vs Module 모드와 커스텀 Find 모듈
고급 (4편)
- C++ 메모리 누수 심화 디버깅 | 힙 프로파일링·패턴·스마트포인터·순환참조·프로덕션
- C++ 서버 메모리 누수 디버깅 사례: Valgrind·ASan·Heaptrack으로 리스너 누적 찾기
- C++ 이름 맹글링: _Z 심볼 읽기, nm·c++filt로 디맹글링, extern C 링크 에러
- C++ 크래시 디버깅 실전 사례 | 간헐적 Segmentation Fault 해결기