C,C++76 [C++] 스택과 힙 메모리, "RAII"라는 패턴 및 기법에 대해 알아보자 RAII가 스마트 포인터와 연관이 있어 해당 카테고리에 작성한다. 먼저 지역 변수와 매개변수가 저장되는 스택 메모리에 대해 알아보자. 스택 메모리 (Stack memory) 스택은 지역 변수와 매개변수가 저장되는 공간이며 예약된 지역 메모리 공간이다. 예약된 메모리라는 말은 동적 할당처럼 사용자의 입력 N에 따라 할당하려는 크기가 변하는 것이 아니라 int arr[10]과 같이 컴파일 타임에 그 크기가 미리 정해지는 메모리란 뜻이다. 예약된 메모리 공간이기 때문에 동적으로 할당하는 힙 메모리와 달리 메모리 할당과 해제에 대한 오버헤드가 없다. 스택은 데이터를 저장할 때 스택의 경계를 넘어 다른 영역이 침범되는 것을 막기 위해 한계치(가장 높은 주소)부터 거꾸로 저장한다. 즉 스택의 top은 스택 메모리 .. 2020. 2. 23. [C++] 추상 클래스와 순수 가상함수를 알아보자(feat. 인터페이스, 다중상속) 추상 클래스 추상 클래스란 순수 가상함수를 1개 이상 가지고 있는 클래스를 말한다. 순수 가상함수란, 구현되지 않은 가상함수를 말한다. 구현되지 않은 가상함수란, 상위 클래스에서 정의는 하지 않고 선언만 해놓은 가상함수를 말한다. 순수 가상함수는 다음과 같이 표시한다. 가상 함수에 0을 대입하여 해당 클래스에선 구현하지 않겠다라는 의미를 부여한다. virtual void PureVirtualFunction() const = 0; // 순수 가상함수 가상 함수를 모른다면 https://woo-dev.tistory.com/50 첫 번째 클래스는 추상 클래스이며 두 번째 클래스는 추상 클래스가 아니다. 1. class FirstClass { public: ... void SampleFunction() cons.. 2020. 2. 20. [C++] CRT 라이브러리로 디버깅 시 메모리 누수 찾기 메모리 동적 할당 후 해제를 따로 하지 않아도 에러가 발생하지 않기에 누수 발생 여부를 알기 어렵다. 이때, CRT 라이브러리를 이용하면 다음과 같이 디버깅 시 누수 지점을 쉽게 찾을 수 있다. Detectd memory leaks! 우선 다음과 같은 선언이 필요하다. #define _CRTDBG_MAP_ALLOC #include #define 문은 메모리 누수 결과를 더 자세히 보여주도록 하는 정의문이라고 하는데 나의 경우 결과가 동일했다. 실제로 더 자세히 보여주기 위해선 new 연산자를 추가 인자와 함께 매크로로 정의하여 몇 가지 정보를 더 출력하도록 해야했다. 그 방법은 잠시 후 소개하고, 결과가 동일해도 혹시 모르니 위와 같이 작성한다. 다음은 누수를 탐지하기 위한 함수들이다. 복잡해보일 수 있.. 2020. 2. 17. [C++] iterator를 이용한 삽입 정렬(Insertion sorting) 구현 - 알고리듬 주어진 vector를 이중 loop를 이용하여 정렬한다. 우선 첫 루프는 이전 요소들과 비교하기 위한 고정 요소를 set하는 루프이다. 고정 요소는 두 번째 요소부터 시작한다.두 번째 루프는 첫 루프의 고정 요소와 비교할 요소를 set하고 정렬을 위한 조건을 검사한다. 내림 차순을 기준으로 고정 요소가 더 크다면 비교 요소의 앞에 삽입되어야 한다. 비교 요소가 더 크다면 올바른 순서이므로 고정 요소이전까지 증가시키며 비교한다. 여기서 핵심 부분은 고정 요소를 비교 요소 앞에 삽입하는 과정이다. vector::insert(iterator, value)를 이용하면 iterator가 가리키는 위치에 value를 삽입할 수 있다. 예를 들어 위 그림의 벡터에서 2를 가리키는 반복자와 3을 인자로 주.. 2020. 2. 13. [C++] insert 함수를 이용하여 vector 합치기 | 벡터(vector) 합치는 법 vector의 insert 멤버 함수를 이용한다. insert는 몇 가지로 오버로딩되어 있는데 그 중 하나를 이용하여 벡터를 합칠 수 있다. 여기서 벡터 A와 벡터 B를 합친다는 의미는 벡터 A의 끝에 벡터 B의 원소를 차례대로 연결한다는 뜻이다. template iterator insert (const_iterator position, InputIterator first, InputIterator last); 위 함수는 position이 가리키는 위치부터 [first, last) 위치의 요소를 추가한다. 따라서 v1 벡터와 v2벡터를 연결하고 싶다면 첫 인자로 v1.end(), 두 번째 인자로 v2.begin(), 세 번째 인자로 v2.end()를 준다. 멤버 함수 end()는 마지막 요소가 아닌 마지.. 2020. 2. 12. [C++] 복사 생성자 및 할당(=) 연산자가 호출되는 시점 | 초기화와 할당의 차이 | RVO(Return Value Optimization) 먼저 초기화(Initializeinitialization)와 할당(Assignment)의 차이부터 살펴보자. 초기화는 객체의 생성과 동시에 초기 값을 설정해주는 것을 말한다. 흔히들 변수 선언만 해놓고 다른 곳에서 값을 할당하는 것을 초기화라고 하는 사람도 있는데, 엄밀히 말하면 이것은 초기화가 아니라 할당이다. 그 이유는, 일단 객체 선언 시 값을 대입을 하지 않으면 객체의 타입에 맞게 알아서 기본 초기화가 된다. 객체가 int, double과 같은 기본 타입(non-class)일 경우는 초기에 값을 할당하지 않을 경우 기본 초기화가 되며, c++에선 기본 타입에 기본 초기화 시 정의되지 않은 쓰레기 값을 갖는다. 반면 string과 같은 class 타입의 객체는 타입에 알맞게 기본 생성자를 호출하여 .. 2020. 2. 7. 이전 1 ··· 5 6 7 8 9 10 11 ··· 13 다음