2012-04-06 3 views
1
I는 어려움이 구문 소화 데

:연산자 새로운 [] 정의 고장

void* operator new[](std::size_t, const std::nothrow_t&) throw(); 

이 여전히 잘 이해하면서 :

void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw(); 

질문 :

  1. I는 new을 생각 및 아래 첨자 []은 다른 연산자입니다. 하나의 정의에서 두 연산자를 결합하여 과부하를 어떻게 할 수 있습니까?

  2. 또한 nowthrow입니다. 다음 호출은 나에게 의미가 없다. (함수의 서명과 관련하여).

    int * p2 = new (nothrow) int; 
    

사람이하지만 큰 아니라 하드 요구 될 것이다 비얀 스트로브 스트 룹의 책에서 관련 항목에 대한 참조를 제공 할 수 있습니다.

UPDATE : 두 질문에 대답 해보세요 :)

+0

Stroustrup의 서적은 참고 문헌이 아닙니다. C++ 표준이 있습니다. 무료 [here] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf) 표준에 매우 근접한 것을 찾을 수 있습니다. – ildjarn

+0

'new []'는'new'와 별개의 연산자입니다 ... –

+0

나는 관련된 '개념적 주제'에 대한 참조를 의미했습니다. 나는이 책을 읽고 그냥 과부하를 끝내고 나는 그 주제와 관련된 모든 것을 다했다고 생각했다. 그러나이 정의는 저를 현혹시킵니다. – PnotNP

답변

2

첫 번째 두 개는 전역 새 연산자의 서명입니다. 가치가있는 것에 대해서는 operator newx = new T;과 같은 새 표현식을위한 공간을 할당하는 데 사용되고 operator new[]x = new T[count];과 같은 새 표현식을위한 공간을 할당하는 데 사용됩니다. 가치가있는 "작은"것은 아주 간단한 이유입니다. new T[count]을 사용하면 안되며, 작동 방식은 거의 전적으로 역사적인 호기심입니다.

원하는 경우 힙 할당을 제공하기 위해 ::operator new 및/또는 ::operator new[]을 오버로드 할 수 있습니다. 에는 두 가지 사이에 차이가없는이 있습니다. 기본 요구 사항은 모두 요청한 메모리 양을 할당하고 포인터를 반환합니다.

까지 operator new으로 전달되는 크기는 항상 개체의 크기와 사용자가 지정한 개수의 배열에 따라 컴파일러에서 계산됩니다. 따라서 새 식에서 지정하는 매개 변수는 operator new에 전달되는 두 번째 매개 변수로 바뀝니다.

내가 위에 아주 충분히 명확하게되지 못한 점을 강조하려면 사용하는 operator new (및 operator new[])을하지만, 새로운 표현 (당신이 x = new T; 같은 것을 말할 때 당신은 당신의 코드에서 무엇을) 분리. operator newoperator new[]은 마치 malloc과 거의 같습니다. 그들은 "원시"메모리를 할당합니다. 새 표현식 은 원시 메모리를 할당하기 위해 이들 중 하나를 사용하고 해당 메모리에 객체 (또는 new T[count];의 경우 둘 이상)를 할당하기 위해 생성자를 호출합니다. 이 두 가지는 분명히 관련되어 있지만 똑같이 분명히 동일하지는 않습니다.

다른 작은 점 : operator new (또는 operator new[])을 클래스 멤버로 가질 수도 있습니다. 이렇게하면 전역 힙을 사용하는 다른 메모리와 다른 방식으로 클래스를 할당 할 수 있습니다. 많은 양으로 할당하려고하는 작은 객체들입니다. 이들을 위해서, 전역 힙은 피해야 할 오버 헤드가 많을 수 있습니다.

마지막으로 /를 원시 메모리에 할당하려면 또한 operator newvoid *a = ::operator new(1234); 에서처럼 직접 호출합니다. 자신이 일종의 컬렉션 클래스를 구현하기로 결정한 경우 (순환 버퍼가 필요한 경우)

3

새로운 [] 및 [] 두 개의 완전히 다른 연산자를.

new []는 배열의 할당 연산자이고 []은 배열의 subscript 액세스 연산자입니다.

new []는 자신의 연산자입니다. '[]'첨자 연산자와 결합 된 것은 단순히 '새로운'할당자가 아닙니다.

1

newnew[]은 두 개의 별도 연산자이며 '[]'연산자와 관련이 없습니다. 이것은 delete pdelete[] p의 차이에서 가장 잘 나타납니다. p 또는 인스턴스의 전체 배열을 가리키는 단일 인스턴스를 삭제 하시겠습니까?

마찬가지로, new[]은 모두 동일한 메모리 블록에있는 개체의 전체 배열을 할당하는 방법입니다.