operator new 함수의 위치지정 버전을 만들 때는, 이 함수와 짝을 이루는 위치지정 버전의 oeprator delete 함수도 꼭 만들어야 한다. 그렇지 않으면, 메모리 누출이 생길 수 있다. new와 delete의 위치지정 버전을 선언할 때는, 의도한 것과 달리 표준 버전이 가려지는 일이 생기지 않도록 주의해야 한다. 위치지정 new & 위치지정 delete 다음과 같은 new표현식을 썼을 때 호출되는 함수는 두 개다. Widget* pw = new Widget; 메모리 할당을 위해 operator new가 호출되고, 그 뒤를 이어 Widget의 기본 생성자가 호출된다. 여기서, 첫 번째 함수 호출은 무사히 지나갔는데 두 번째 함수 호출이 진행되다가 예외가 발생했다고 가정해 보자. 그렇다면 첫 ..
NEW
관례적으로, operator new 함수는 메모리 할당을 반복해서 시도하는 무한 루프를 가져야 하고, 메모리 할당 요구를 만족시킬 수 없을 때 new 처리자를 호출해야 하며, 0바이트에 대한 대책도 있어야 한다. 클래스 전용 버전은 자신이 할당하기로 예정된 크기보다 더 큰 메모리 블록에 대한 요구도 처리해야 한다. operator delete 함수는 널 포인터가 들어왔을 때 아무 일도 하지 않아야 한다. 클래스 전용 버전의 경우에는 예정 크기보다 더 큰 블록을 처리해야 한다. new와 delete 작성 관례 사용자 정의 new와 delete를 작성할 때 지켜야 하는 관례가 있다. 우선, operator new를 보면 요구사항 몇 가지를 지켜야 한다. 반환 값이 제대로 되어 있어야 하고, 가용 메모리가 부..
개발자가 스스로 사용자 정의 new 및 delete를 작성하는 데는 여러 가지 이유가 있다. 여기에는 수행 성능 향상, 힙 사용 시의 에러 디버깅, 힙 사용 정보 수집 등의 목적이 있다. new와 delete operator new와 operator delete를 바꾸는 목적은 여러 가지가 있다. 가장 흔한 이유는 다음과 같다. 잘못된 힙 사용을 탐지하기 위해 new한 메모리에 delete를 하는 것을 잊어버리면 메모리가 누출된다. 한 번 new한 메모리를 두 번 이상 delete하면 미정의 동작이 발생한다. 만일 할당된 메모리 주소의 목록을 operator new가 유지해 두고 operator delete가 그 목록으로부터 주소를 하나씩 제거해 주게 만들어져 있다면, 이런 실수는 쉽게 잡아낼 수 있다...
set_new_handler 함수를 쓰면 메모리 할당 요청이 만족되지 못했을 때 호출되는 함수를 지정할 수 있다. 예외불가 new는 영향력이 제한되어 있다. 메모리 할당 자체에만 적용되기 때문이다. 이후에 호출되는 생성자에서는 얼마든지 예외를 던질 수 있다. new 처리자의 동작 원리 할당할 메모리가 없을 때 operator new 함수는 예외를 던지게 되어 있다. 메모리 할당이 제대로 되지 못한 상황에 대한 반응으로 operator new가 예외를 던지기 전에, 사용자 쪽에서 지정할 수 있는 에러 처리 함수를 우선적으로 호출하도록 되어 있는데, 이 에러 처리 함술 가리켜 new 처리자(new_handler)라고 한다. 이와 같은 메모리 고갈 상황을 처리할 함수를 사용자 쪽에서 지정할 수 있도록, 표준 ..
new 표현식에 []를 썼으면, 대응되는 delete 표현식에도 []를 써야 한다. 마찬가지로 new 표현식에 []를 안 썼으면, delete 표현식에도 []를 쓰면 안 된다. new, delete 사용 시 주의점 std::string *stringArray = new std::string[100]; ... delete stringArray; 문제가 없어 보이는 코드이지만, 미정의 동작을 보이게 된다. 최선의 경우에도 stringArray가 가리키는 100개의 string 객체 중 99개는 정상적으로 소멸되지 않을 가능성이 크다. 삭제되는 포인터가 객체 하나만 가리키는지 객체의 배열 가리키는지에 따라 delete가 소멸자를 몇 번 호출할지 결정한다. 단일 객체와 객체 배열에 대한 메모리 배치구조가 다르기..