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