본문 바로가기
반응형

분류 전체보기686

실행 중인 프로세스(Process)를 디버깅하기 실행 중인 프로세스를 디버깅하기개발 중에는 IDE(통합 개발 환경)를 통해서 개발하기 때문에 보통 IDE에서 디버그 모드나 릴리즈 모드로 프로그램을 실행하게 된다. 하지만 이게 익숙해지다 보면 프로그램을 exe 파일을 더블클릭해서 실행하는 게 기본인데 이를 망각하게 된다. 개발이란 이런 기본적인 것조차 까먹게 만드는 무시무시한 것이다. 그렇다면 IDE를 통하지 않고 실행시킨 프로그램을 마치 IDE에 실행시킨 것처럼 연결시키는게 가능할까?물론 가능하다.예제 코드그냥 무한히 실행되도록 만든 말이 안되는 예제 코드이다. 해당 코드를 빌드해서 실행시키면 무한히 실행될 것이다.void main(){ std::cout 작업 관리자에서도 무한히 실행 중인 것을 확인할 수 있다.비주얼 스튜디오에서 프로세스를 디버그로 .. 2026. 1. 24.
unique_ptr vs shared_ptr 차이는 무엇인가? C++가 제공하는 똑똑한 포인터C++의 스마트 포인터는 말 그대로 똑똑한 포인터로, 프로그래머가 발생시킬 수 있는 메모리 관리의 실수(메모리 누수, 댕글링 포인터 등)를 방지하기 위해서 설계된 도구이다. 그리고 그중에서 unique_ptr과 shared_ptr은 핵심이 되는 기능들이다.std::unique_ptr 독점적 소유권"객체의 주인은 오직 하나여야 한다"라는 원칙을 따른다. 가비지 컬렉션이 없는 C++에서 가장 효율적으로 자원을 관리하기 위해, 포인터가 스코프(Scope)를 벗어나면 즉시 소멸자를 호출하여 메모리를 해제한다. 성능 오버헤드가 거의 없어 일반 포인터와 차이가 없다.복사 불가: 실수로 복사해서 소유권이 꼬이는 것을 문법적으로 막는다.이동 가능: std::move를 통해서 소유권을 다른.. 2026. 1. 3.
C++ 스마트 포인터 unique_ptr에 대해서 알아보자 unique_ptr 객체는 스택(stack)에 살아요스마트 포인터인 unique_ptr로 생성한 객체 자체는 스택에 존재한다. 스택에 존재하면서 힙에 할당된 메모리를 관리한다. 이를 C++에서는 RAII(Resource Acquisition Is Initialization) 패턴이라고 부른다.실제 예제 코드class MyClass{public: MyClass() { std::cout ptr = std::make_unique(); } // std::unique_ptr ptr 변수가 스택에 생성된다.std::make_unique가 힙에 메모리를 할당하고 그 주소를 ptr 변수에 담는다.이제 스택에 있는 ptr은 힙에 있는 객체의 관리자가 된다.블록이 끝나는 순간 스택에 있던 ptr 변수가 메모리에서 제거된.. 2026. 1. 2.
C++ Erase-remove 관용구란 무엇인가? Erase-remove 관용구(idiom)란 무엇인가?Erase-remove 관용구는 컨테이너(주로 std::vector)에서 특정 조건에 맞는 원소들을 효율적이고 안전하게 제거하기 위해 사용하는 표준적인 방법이다. 단순히 erase만 사용했을 때에 발생하는 성능 저하와 복잡성을 해결해 주는 아주 중요한 기법이다.왜 필요한가?std::vector는 배열과 같이 연속된 메모리 구조를 가지고 있다. 그래서 중간에 있는 원소를 하나 제거하면, 그 뒤에 있는 모든 원소를 앞으로 한 칸씩 당겨야 하는 비효율이 발생한다. 또한, 반복문 안에서 erase를 잘못 사용하면 무효화된 반복자(Iterator Invalidation) 문제로 인해 프로그램이 충돌할 위험 또한 가지고 있다. 이때 이러한 문제를 해결하기 위해서.. 2025. 12. 28.
emplace() vs emplace_back()의 차이점 알아보기 두 함수의 공통점std::vector를 사용할 때 매번 헷갈렸던 두 함수에 대해서 명확하게 정리하고 가보자. 우선 두 함수의 공통점을 알아보자.컨테이너에 요소를 추가하는 함수객체를 내부에서 직접 생성(in-place construction)한다. 즉, 추가시 임시 객체를 생성하지 않는다.emplace()삽입 위치를 사용자가 직접 지정매개변수로 반복자(Iterator)와 생성자 인자를 받는다.반환값으로 생성된 요소의 반복자를 반환한다.std::vector의 경우는 삽입 위치에 따라서 O(n)의 성능emplace_back()이름처럼 컨테이너 맨 끝(end())에 삽입매개변수로 생성자 인자를 받는다.반환값은 voidO(1)의 성능emplace_front()이름처럼 컨테이너 맨 앞(begin())에 삽입매개변수.. 2025. 12. 22.
C++ emplace_back()을 무조건 권장하지 않는 이유는? push_back() vs emplace_back()해당 대결에서 당연히 바로 생성(in-place construction)을 지원하는 emplace_back()을 무조건 권장될 것이라고 생각했는데 현실은 달랐다. C++ Core Guidelines에서 emplace_back()은 무조건 권장되지 않는다. 이유는 무엇일까?좋아 보이기만 했던 emplace_back()의 문제점emplace_back은 단순 삽입 API가 아니라, 컨테이너 내부 타입의 모든 생성자를 외부로 공개하는 API이다.생성자 오버로드가 많을수록initializer_list가 있을수록explicit 생성가 있을수록해당 경우에 해당할수록 호출자가 의도하지 않은 생성자가 선택될 가능성이 상승한다. Core Guidelines는 이를 'AP.. 2025. 12. 22.