
C++ 환경에서 접할 수 있는 대표적인 메모리 오류 1. 메모리 누수(Memory Leak) 'new'로 할당한 메모리를 해제하지 않을 때 쓰이지 않는 메모리가 지속적으로 쌓이면서 시스템 메모리를 고갈시킴 시간이 지날수록 프로그램 속도가 느려지고 나중에는 강제 종료가 되기도 함 2. 댕글링 포인터(Dangling Pointer) 메모리를 해제할 때 이미 해제한 메모리에 접근하다 발생하는 접근 오류 프로그램이 강제 종료될 수도 있음 3. 메모리 단편화(Memory Fragmentation) 잦은 할당과 해제로 만들어진 메모리 파편들이 후에 새롭게 할당 하는 것을 방해하는 문제 극단적으로 파편화된 메모리는 새로운 메모리 공간을 찾는 데 CPU 소모량이 높아지거나 결국 할당에 실패함 스택 메모리를 좀 더 똑똑..

클래스, 구조체 네이밍 방법 클래스 대문자로 시작하되 'C' 접두어를 기입 클래스 객체는 대문자로 시작 구조체 구조체는 대문자와 언더바로 작성하고 ST_접두어로 시작 구조체 객체는 'st'와 대문자로 시작 // 클래스 네이밍 class CMyClass; CMyClass Myclass; // 구조체 네이밍 struct ST_ELEMENT ST_ELEMENT stElement; 클래스에 'Manager' 용어는 피하기 'Manager' 라는 단어는 어떠한 행동을 수행하는지 모호하게 해석될 수 있으므로 좀 더 구체적인 행위를 표현하는 단어로 네이밍을 해야 함 // 고객 정보를 담아두는 역할 class CCustomerContainer { // TODO } // 고객 정보를 접근하는 역할 class CCusto..

정적 라이브러리 사용의 목적 빌드 시간이 단축됨 소스코드를 공개하지 않고 기능을 제공할 수 있음 동적 라이브러리에 비해 안전함 재사용 가능한 코드를 지속적으로 모아둘 수 있음 여럿이 효율적으로 개발할 수 있는 아키텍처를 설계할 수 있음 정적 라이브러리 만들기 1. 정적 라이브러리 프로젝트 생성 2. 소스 트리 정리 3. 기능 구현 4. 빌드 및 확인 정적 라이브러리 배포하기 배포할 때 유의 사항 빌드 후, 라이브러리 파일과 헤더파일 두가지를 제공해야 한다. 정적 라이브러리 사용하기 1. 컴파일러 지시자 이용 컴파일러에게 코드로 라이브러리 경로를 알려주는 방법 #pragma comment(lib,".lib 가 있는 디렉토리 주소") #include"../[라이브러리 이름]/[함수].h" 2. Visual ..

파일 비우기 처음 프로젝트를 생성할 때 '빈 프로젝트' 로 생성하기 솔루션 탐색기 메뉴의 '소스 파일', '헤더 파일'은 제거하기 공통 헤더파일 만들기 코드 전체적으로 자주 사용되는 구문이나 헤더를 한곳에 모아서 중복되는 코드를 정리하는 기술 반복적으로 작성될 코드를 모아둘 수 있음 매번 파일에 새로 작성하는 수고로움이 줄어듬 리소스 파일 추가하기 산출물 관리를 위한 디렉터리 정리 빌드 파일과 소스 파일을 분리하여 산출물 관리를 편하게 배치하는 것이 핵심 *파일 디렉터리 설정법 속성 메뉴 상단의 '구성', '플랫폼' 을 '모든 구성', '모든 플랫폼' 설정으로 변경 출력 디렉터리와, 중간 디렉터리 설정을 아래 주소로 설정 출력 디렉터리 $ (ProjectDir)\..\..\Build\$(Platform)..
설명 ByteWap() 함수를 사용하면 자료형 크기에 맞는 엔디언 변환 함수가 선택된다. 값 형식 자료형에 대응하기 위하여 템플릿을 사용했다. 내부적으로 엔디언 변환 연산과정을 거칠 때 캐스팅 작업이 진행된다. #pragma once #include using namespace std; // 2바이트 엔디언 변환 함수 inline uint16_t ByteSwap2(uint16_t inData) { return (inData >> 8) | (inData > 24) & 0x000000ff) | ((inData >> 8) & 0x0000ff00) | ((inData 56) & 0x00000000000000ff | (inData >> 40) & 0x000000000000ff00 | (inData >> 24) &..
함수 설명 stoi string -> int stol string -> long stoll string -> long long atoi byte string(= const char*) -> int atol byte string(= const char*) -> long atoll byte string(= const char*) -> long stod byte string(= const char*) -> double stof byte string(= const char*) -> float stold byte string(= const char*) -> long double stoul string -> unsigned long stoull string -> uinsigned long long stoi 예시 #..
std::unique_ptr 특징 리소스를 독점 복제 불가 메서드 이름 설명 get 리소스에 대한 포인터를 리턴 get_deleter delete 함수를 리턴 release 리소스에 대한 포인터를 리턴하고 그 리소스를 해제 reset 리소스를 리셋 swap 리소스를 맞바꿈 코드 예제 // 이것은 unique_ptr 예제 #include #include using namespace std; struct MyInt { MyInt(int i) :i_(i) {} ~MyInt() { cout
유틸리티 (Utility) 유틸리티 라이브러리는 여러 문맥에 두루 활용할 수 있는 범용 기능을 모아둔 라이브러리이다. 종류 함수 설명 std:: function bind 로 만든 함수를 나중에 호출하기 위해 변수에 바인딩하기 위해 사용된다. std:: bind 기존 함수를 토대로 새로운 함수를 쉽게 만들 수 있다. std:pair 임의의 길이로 된 이형(heterogeneous) std::tuple 페어를 일반화 std:ref 변수에 대한 레퍼런스 래퍼 오브젝트 std:cref const 레퍼런스 std::unique_ptr 스마트 포인터, 단독 소유권 std::shared_ptr 스마트 포인터, 공유 소유권 STL 구성요소 컨테이너(Container) 알고리즘(Algorithm) (약 100가지의 알고..