{ 왜? 보는 사람이나 개발하는 사람이나 메모리 누수인가? 아닌가? 에 대해서 고민하게 만들기 때문이다. 어디서 할당하고 어디서 해지 해야 하는가? 하나의 모듈에서 할당해서 해지 해야 한다. 작게 말하면, 하나의 클래스 내부에서 생성된 메모리는 클래스 내부에서 해제 한다는 뜻으로 해석해도 무난 하다. 부득이 하게, 다른 모듈과 연관된 경우에는 어떻게 하는가? 이럴 때를 위해서 우리의 부스트께선 스마트 포인터(Smart Pointer)를 만들어 두었으니, 이것을 이용 하면 된다. 스마트 포인터의 사용법을 알려 줄 수 있는가? 부스트의 스마트 포인터는 여러개가 있지만 shared_ptr 를 많이 사용 한다. 검색의 왕인 구글에게 물어 보면 잘 알려 주므로 생략 하겠다. }
C++ 코딩의 정석 검색 결과
{ 네임스페이스 using이 무엇인가? namespace를 선언된 위치로 모두 끌고 오는 엄청난 매력적인 녀석이다. 사용 방법은 using std; 처럼 namespace를 지칭하면 된다. 이 매력적인 녀석이 왜 안되나? .. 너무 매력적이면 역시 근심 덩어리다. 앞에서 알짱거리는 매력적인 녀석을 항상 서로 차지하려고 다투는데 얼마나 골치 아프겠는가? (#include 앞) 예를 들어 줄 수 있는가? // s1.h 을 다음과 같이 만든다. #pragma once #include namespace A { int f(double) { std::cout
{ 클래스의 일부가 되게끔 디자인된 비멤버 함수의 경우, 클래스와 같은 네임스페이스 내에 넣어야 한다는 것이다. 왜!? C++의 이름 검색 시스템 때문이다. 이 이름 검색 시스템은 Koenig lookup 라고도 불린다. 해당 사항을 자세히 말해 줄 수 있는가? 물론 말해 줄 수 있다. Exceptional C++ 항목 31 ~ 항목 34 에 무척 자세히 나와 있고, ikpil.com 에서 검색해도 어느 정도 나오니 한번 검색해 봄이 좋을 것 같다. 넣게 되면 무엇이 좋아 지는가? 최소한 컴파일러가 혼란을 겪는 것을 줄여 주고, 개발자 또한 혼란을 겪는 것을 줄여 줄 수 있다. 간략하게만 소개해 줄 수 있나? #include void swap( std::string const& str1, std::str..
{ 여기서 말하는 일관된 방식은 무엇인가? 복사 생성자(T(const T&))를 정의했다면, 복사 할당자(operator=), 디스트럭터(~T()) 를 정의 하라는 것이다. 왜? 복사 생성자를 정의 했다는 의미는 무엇인가 특별한 멤버 변수를 갖는 다는 것을 의미한다. 그러므로, 복사 할당자나 디스트럭터나 특별히 무엇인가 작업을 해 주어야 한다는 것이다. 자신이 뿌린 씨앗은 자신이 거두어야 한다는 것을 의미하는 것과 같다. 복사 생성자만 그러하나? 의미를 볼땐 위의 3가지 중 하나라도 정의 했다면, 다 정의 해 주는게 좋다. 누가 좋다고 하는가? 허브 셔터와 안드레이 알렉산드레스쿠가 그런다. ... 예외는 없는가? 물론 있다. 굳이 3개를 짝으로 구현할 필요가 없다면, 안해도 된다. 이때는 애초에 정의할 ..
{ .. 실패하지 않는다가 아니라. 실패해서는 안된다가 더 적당할 듯 싶다. 왜 그럴까? 각개 격파해서 정리한다. 디스트럭터에서 실패하면 왜 안되는가? 객체의 소멸 시점은, 자신이 속한 지역을 벗어 날 때이거나, 명시적으로 없애고자 할 때이다. 자신이 속한 지역에서 벗어 날 때는 무척 광범위한 영역에서 발생 할 수 있는데, 대표적으로 값에 의한 전달을 이용하는 함수에서 많이 일어 날 수 있을 것 같다. 값이 복사 되고 예외가 발생 했다고 치자. 이때 예외가 발생해서 지역을 탈출 하려고 하는데, 탈출 시 "스택 되감기"가 이루어 지면서, 다시 소멸자가 호출 되어 지고, 여기서 예외가 발생 한다 치자. 그러면 예외 중에 예외가 발생 한 것이니, C++ 에선 그냥 프로그램을 죽이는 함수를 호출 한다. 프로그램..
{ 이번 항목은 좀 역발상으로 이야기를 쫒아 본다. 기반 클래스의 디스트럭터가 public 과 virtual 이라면, 파생 클래스에게 어떠한 영향을 미치는가? 1. 객체 생성이 자유롭다. 2. 객체의 완전한 소멸이 기반 객체의 포인터로도 가능하다. 그렇다면, protected 와 non-virtual 이라면? 1. 객체 생성이 friend나 상속 기반에서만 이루어 진다. 2. 객체의 완전한 소멸은 항상, 파생 클래스에서만 가능하다. 이 두가지 방식을 따라야 하는 이유는 무엇인가? 메모리가 누수될 가능성이 무척 커진다. 이해 못하겠다. 예제를 보여 달라. #include #include // example class Base { public: ~Base() // non virtual { std::cout
최근댓글