여기서 말하는 형태는 무엇인가? new 와 delete, new [] 과 delete [] 를 말한ㄷ. 왜 형태를 맞추어야 하는가? new 연산은 단일 객체 메모리 잡는 연산자이고 delete 역시 단일 객체 메모리 푸는 연산자이다. new[] 연산은 객체 배열을 메모리에 잡는 연산자이고 delete[] 역시 객체 배열을 메모리에 푸는 연산자이다. 만약 맞추지 않으면 어떻게 되는가? new [] 로 객체들 5개를 잡았고 delete 를 이용하면 1개의 객체만 풀어주고 나머지 4개는 프로그램 종료되기 까지 잡고 있는 어처구니 없는 사태가 발생한다. 굳이 주의해야 하는 것은? typedef 로 typedef std::string addressLines[4] 로 잡은 뒤 std::string *p = new ..
EC++ 검색 결과
외부에서 접근하면 캡슐화가 무너지지 않나? RAII 방식의 객체의 경우 자원의 관리에 그 중점을 두었기 때문에, 그리고 설계상에 멤버 변수로써의 값으로 많이 쓰이기 때문에, 다 무너진다고 볼순 없다는게 저자의 견해이다. 개인적으로 참조자의 객체형은 외부 접근이 있는게 더 유용하다고 판단된다. 왜 더 유용한가? 자원이라는것이 엄밀히 말하면 메모리가 많은데, 윈도우 API에선 .. HDC, HPEN, ..... 등등 미칠듯이 많다. 이것들을 쓸때마다 외부접근이 안되버리면 .. 더 유용하지 않게 된다! 외부접근을 어떻게 해야 하는가? 크게 명시적 호출방법과 암시적 호출 방법이 존재한다. 명시적 호출 방법은 말 그대로 특정 멤버 함수를 이용하여, 자원의 참조자를 얻어 오는 방법이고, 암시적 호출 방법은 oper..
왜냐하면? 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문으로 비교하여, 같다면 하는일 없이 리턴을 하지만, 자기 대입이 일어날 경우는 적기 때문에, 모든 객체에 대해서 조사하는것은 효율이 낮다. 그렇기 때문에 우선 매개체를 복사한 후에, 복사된 매개체와 내자신과 바꾸는 방법을 많이 사용한다..
최근댓글