블로그
-
C++ 컴파일 과정 4단계: 전처리·컴파일·어셈블·링킹과 undefined reference가 나는 이유
소스 파일이 전처리, 컴파일, 어셈블, 링킹을 거쳐 실행 파일이 되는 과정을 단계별 명령으로 확인하고, undefined reference가 링크 순서나 이름 맹글링 때문에 생기는 이유, 정적 라이브러리와 동적 라이브러리의 차이, 수정이 빌드에 반영되지 않는 문제를 다룹니다.
-
C++ 전처리기 제대로 쓰기: #define과 #ifdef 실전 패턴
redefinition 에러, Windows와 Linux API 분기, 디버그 빌드 전용 로그, __FILE__과 __LINE__을 넣은 assert처럼 전처리기가 필요한 상황을 예제로 풀고, 가변 인자 매크로와 확장 순서, 인자에 쉼표가 든 매크로의 함정을 설명합니다.
-
C++ 스택 vs 힙 | 재귀에서 프로그램이 죽는 이유와 스택 오버플로우 사례
깊은 재귀로 프로그램이 갑자기 죽는 사례에서 출발해 스택과 힙이 메모리에서 어떻게 다르게 동작하는지, 힙 할당이 느린 이유, delete와 delete[]를 헷갈리는 실수, 언제 스택을 쓰고 언제 힙에 할당할지 판단하는 기준을 예제로 설명합니다.
-
C++ 메모리 누수: 흔한 5가지 패턴과 Valgrind·ASan으로 찾는 방법
메모리 누수로 서버가 멈춘 사례를 따라가며 이중 삭제, 댕글링 포인터, 누수, delete와 delete[] 혼동, 예외 안전성 무시 5가지 패턴을 재현하고, early return과 컨테이너 포인터 누수를 Valgrind와 AddressSanitizer로 찾아내는 과정을 보여줍니다.
-
C++ 스마트 포인터 | 3일 동안 찾지 못한 순환 참조 버그 해결법
Valgrind는 누수가 없다는데 메모리가 계속 늘던 shared_ptr 순환 참조 버그를 출발점으로, unique_ptr의 소유권 이전과 커스텀 삭제자, shared_ptr의 참조 카운팅 구조와 비용, weak_ptr로 순환을 끊는 법과 상황별 선택 기준을 다룹니다.
-
Valgrind Memcheck로 C++ 메모리 누수 찾아내기
C++ Valgrind Memcheck로 메모리 누수·힙 버퍼 오버런·초기화 안 된 값을 찾는 방법. definitely lost·invalid read/write·uninitialised value 출력 해석, suppression 파일 작성, CI 통합까지 예제로 설명합니다.
-
C++ RAII: 생성자에서 획득하고 소멸자에서 해제하는 자원 관리 클래스 만들기
파일 핸들을 닫지 않아 '파일을 열 수 없습니다' 장애가 난 사례에서 시작해, 생성자에서 획득하고 소멸자에서 해제하는 RAII로 파일, 뮤텍스, 소켓, DB 트랜잭션을 관리하는 클래스를 직접 만들고 복사와 이동 규칙을 정하는 방법을 보여줍니다.
-
C++ std::thread와 jthread: 스레드 풀 구성과 성능 비교
std::thread에 함수, 람다, 인자를 넘기는 법과 std::ref가 필요한 이유, join과 detach로 수명을 관리하는 법, 예외가 나도 스레드를 정리하는 ThreadGuard와 C++20 jthread, mutex와 condition_variable 기초까지 멀티스레딩의 첫 단계를 다룹니다.
-
C++ mutex: 경쟁 상태, 데드락, lock_guard·scoped_lock 사용 원칙
주문 수가 맞지 않는 카운터 버그로 race condition과 data race를 구분하고, 재고 감소나 작업 큐 중복 처리 같은 사례를 mutex로 고칩니다. lock_guard와 unique_lock 선택 기준, 락 순서 통일과 std::lock, scoped_lock으로 데드락을 피하는 법도 설명합니다.
-
C++ 고급 멀티스레딩 | 스레드 풀·Work Stealing
C++ 스레드 풀·Work Stealing·Lock-Free 큐·메모리 순서·Thread-Local Storage 등 고급 멀티스레딩 패턴. 실제 문제 시나리오부터 프로덕션 패턴까지, 1000줄 분량의 실전 가이드.