블로그
-
C++ 소멸자와 RAII: 가상 소멸자, 규칙 0, 소멸자에서의 예외
소멸자 호출 순서, 가상 소멸자가 필요한 정확한 조건과 대안(protected 비가상), Rule of 0/3/5, 소멸자에서의 예외·this 사용 함정, 스마트 포인터와의 조합까지 실무 기준으로 정리합니다.
-
C++ 가상 함수 현장 매뉴얼 | 설계·비용·override·실무 패턴 한글 정리
가상 함수를 언제 쓰고 언제 템플릿이나 variant로 대체할지, override/final로 시그니처 실수를 막는 법, NVI 관용구, 다형 호출 비용과 캐시 친화 설계, 자주 보이는 안티패턴을 정리합니다.
-
npm install 에러 해결 10가지: EACCES, ENOSPC, Timeout, peer dependency
npm install이 EACCES, ENOSPC, ERR_SOCKET_TIMEOUT, peer dependency 충돌, ERESOLVE, 404, node-gyp 빌드 실패, 캐시 손상, lock 파일 충돌, Windows 경로 길이 제한으로 실패할 때 원인별 해결책을 정리합니다.
-
C++ 이름 은닉(Name Hiding): 파생 클래스에서 기반 오버로드가 안 보일 때 using 선언
파생 클래스에 같은 이름의 함수를 하나만 선언해도 기반 클래스의 오버로드 전체가 가려지는 이름 은닉의 원리를 설명하고, using 선언으로 되살리는 법과 오버로딩·오버라이딩·은닉의 차이를 생성자와 연산자 예시로 정리합니다.
-
C++ shared_ptr 순환 참조 누수: weak_ptr로 끊는 기준과 디버깅 방법
두 객체가 서로를 shared_ptr로 가리키면 참조 카운트가 0이 되지 않아 소멸자가 불리지 않습니다. 부모-자식 트리, 캐시, 옵저버에서 한쪽을 weak_ptr로 바꾸는 기준과 use_count(), Valgrind, AddressSanitizer로 누수를 확인하는 법을 다룹니다.
-
C++ Small String Optimization (SSO) | string 성능 최적화 원리
std::string이 짧은 문자열은 힙 할당 없이 객체 내부 버퍼에 저장하는 Small String Optimization의 구조를 설명하고, 주소 비교와 sizeof로 SSO 여부를 확인하는 법, 생성과 복사 벤치마크, 간단한 SSO 구현 예시를 다룹니다.
-
C++ RVO와 NRVO: C++17 보장 복사 생략과 return std::move가 NRVO를 막는 경우
return 문에서 복사가 언제 생략되는지 RVO와 NRVO를 나눠 설명하고, C++17이 보장하는 복사 생략의 범위와 여러 반환 경로나 return std::move 때문에 NRVO가 깨지는 경우를 GCC로 직접 확인한 결과와 함께 보여줍니다.
-
C++ 가상 소멸자가 없을 때 생기는 누수: virtual·protected 소멸자 선택 기준
기반 클래스 포인터로 파생 객체를 delete했는데 파생 소멸자가 불리지 않아 메모리와 파일 핸들이 새는 이유를 보여주고, virtual 소멸자, 순수 가상 소멸자, protected 소멸자 중 언제 무엇을 쓰는지와 vtable 오버헤드를 설명합니다.
-
C++ 객체 슬라이싱 에러: vector<Base>에 담을 때 잘리는 이유와 clone 패턴
파생 객체를 기반 클래스 값으로 넘기거나 vector<Base>에 담는 순간 파생 멤버와 가상 함수 동작이 잘려 나가는 슬라이싱이 왜 생기는지 보여주고, 참조·스마트 포인터·clone() 패턴과 복사 생성자 delete로 막는 법을 다룹니다.
-
C++ 정적 초기화 순서 문제(Static Initialization Order Fiasco): 재현과 함수 내 static·constinit 해결
다른 .cpp 파일의 전역 객체가 아직 초기화되지 않은 상태에서 쓰여 크래시가 나는 Static Initialization Order Fiasco를 링크 순서만 바꿔 재현하고, 함수 내 static, constinit, Nifty Counter 같은 해결책을 비교합니다.