왜냐하면? RAII 방식은 객체의 scope(존재 할 수 있는 범위)를 이용하여, 자원을 관리하는데, 객체를 복사 했을때, 소멸자를 어떻게 정의하느냐에 따라서, 전기적 쇼크를 프로그래머에게 줄지, 램에게 줄지 결정지을수 있기 때문이다. .. 전기적 쇼크는 항상 램에게만 줘야 한다. 일반적인 사례 1. 복사를 금지한다 - 유니크한 객체를 관리할 때 사용 한다. 2. 관리하고 있는 자원에 대해 참조 카운팅을 수행한다. - 해당 자원을 가르키는 포인터만을 복사 할때, 카운팅 한다. 까다롭지만 가장 효율적인 방법이다. 3. 관리하고 있는 자원을 진짜로 복사한다. - 보통 문자열 객체에 대해 관리할때 사용 한다. 클래스 인터페이스를 무시할 경우가 많이 생기기 때문이다. []연산자 때문에.. 4. 관리하고 있는 자..
책 정리 검색 결과
여기서 "그만" 이라는 뜻은, "적격"이다라는 뜻이다. 왜 객체가 적격일까? 그 이유는 스택에 올라간 객체는 Scope(존재 할수 있는 범위)가 있어, 자신의 Scope를 벗어나면, 소멸자가 호출이 된다. 이 소멸자에서 자원을 반환해 주는 코드를 넣어주면, 자원의 얻고, 반환을 자동화 시킬수가 있기 때문이다. 자원 관리 객체의 기본적인 구조 처음은 생성자에서 동적메모리 할당으로 얻은 주소값를 인자로 객체를 생성과 동시에 초기화 한다. 자원 획득은 초기화!(Resource Acquisition Is Initization : RAII, 비야네 스트롭스트룹 은 이 용어를 처음 제시했고, TC++PL의 14장에서 그 견해를 들을수 있다고 한다.) 끝으로 소멸자에서 이 자원을 delete 해 준다. 이렇게 하면 ..
빠짐없이 복사 안하면 어떻게 될까? ... 얼토당도 안되는 질문이지만, 복사한다는 의미를 모든것을 복사한다고 정의 내려, 모든 사람들이 이 규칙을 따른다면, 다른 사람이 만든 코드를 볼때라든지, 복사를 한다고 했을때의 연산등을 정확하게 알수 있는 장점이 있다. (여담으로 컴파일러가 만들어주는 복사 생성자나 대입연산자들은 .. 이 규칙을 따라 엄격하게 복사만해준다.) 무조건 다 복사해주겠는데, 주의해야 할 점은 무엇이 있어? 1. 기존의 클래스에서 멤버를 추가하려 할때, 복사생성자, 대입 연산자 들을 수정해야 한다. 2. 포인터 멤버 변수일때, 깊은 복사를 해야 하는지 얕은 복사만을 해야 하는지 염두해두어야 한다. 3. 파생 클래스에서 베이스 클래스의 복사생성자와 파생 클래스의 대입연산자도 수정해야 한다...
자기대입이 왜 위험한가? 같은 객체를 가리키는 참조자 두개(A 와 B)가 A = B 라고 해 놓고 delete B 라고 했을 때, A가 가르킨 객체는 이미 전기적 신호를 받고 날라간 상태이다. 그렇기 때문에, 같은 타입으로 만들어진 객체 여러 개를 참조자 혹은 포인터로 물어 놓고 동작하는 코드를 작성할 때는 같은 객체가 사용될 가능성을 고려하는 것이 일반적으로 바람직한 자세이다. 어떻게 이 위험으로부터 보호하겠는가? 참조자의 경우, 주소가 같기 때문에, 같은 주소인지 if문으로 비교하여, 같다면 하는일 없이 리턴을 하지만, 자기 대입이 일어날 경우는 적기 때문에, 모든 객체에 대해서 조사하는것은 효율이 낮다. 그렇기 때문에 우선 매개체를 복사한 후에, 복사된 매개체와 내자신과 바꾸는 방법을 많이 사용한다..
이유 1. 객체의 생성과 소멸과정 중 가상 함수가 날라간 상태라면 신비로운 동작을 하기 때문이다. 왜냐하면 파생 객체가 만들어 질때, 베이스 생성자가 호출되는 동안은 베이스 생성자만 초기화 값을 가지고 있고 베이스 클래스의 소멸자가 호출되어 질때, 이미 파생 클래스의 데이터들은 이미 소멸되었기 때문에, 파생클래스 쪽으로 내려가서 호출되어지지 않기 때문이다! 주의점 1. 객체의 생성과 소멸 시점에 대해서 숙지하고 있어야 한다. 참조 구역 참조 참조 상속 관계에 있는 객체의 생성자와 소멸자 호출 시점 1. 생성자 호출 시점 첫째, 베이스 생성자 호출 후 베이스 생성자의 멤버 객체들 초기화 둘째, 파생 생성자 호출 후 파생 생성자의 멤버 객체들 초기화 2. 소멸자 호출 시점 첫째, 파생 소멸자 호출 후 파생 ..
최근댓글