2011-10-18 8 views
3

이전에 할당 된 메모리 블록에서 객체 배열을 생성해야합니다. 그러나, 나는 블록의 크기를 필요로하기 때문에 어떤 방식으로 ::operator new[]()::operator new()과 다른지 이해할 수 없다. 다음 예제에서 둘 중 하나를 사용하면 동일한 효과가있는 것으로 보입니다. 내가 놓친 게 있니?어떤 식으로 : :: operator new()와 다른 :: operator new []()?

class J { 
}; 

int main() { 
    const int size = 5; 

    { 
     J* a = static_cast<J*> (::operator new[](sizeof (J) * size)); 
     for (int i = 0; i < size; i++) 
      new (&a[i]) J(); 
     for (int i = 0; i < size; i++) 
      a[i].~J(); 
     ::operator delete[] (a); 
    } 

    { 
     J* a = static_cast<J*> (::operator new(sizeof (J) * size)); 
     for (int i = 0; i < size; i++) 
      new (&a[i]) J(); 
     for (int i = 0; i < size; i++) 
      a[i].~J(); 
     ::operator delete (a); 
    } 
} 
+0

가능한 [별도의 "연산자 new \ [\]"를 갖는 목적은 무엇입니까?] (http://stackoverflow.com/questions/2499895/whats-the-purpose-of-having-a-separate -operator-new) –

+0

나는 그 같은 생각을하지 않습니다. 거기 OP는 차이가 무엇인지 알고 있었고 이유를 묻고있었습니다. 여기서 OP는 그 차이점을 묻습니다. C++에 능통 한 사람이라면 혼란 스럽기 쉽지만 분명히 같은 질문은 아닙니다. – littleadv

+0

@ littadadv : 내가 (여전히 귀하의 의견을 고려한 후) 그것을 볼 때, 확실히 똑같은 질문입니다. –

답변

3

당신은 new을 잘못 사용하고 있습니다.

new []을 사용하는 지점은 할당 할 배열의 각 요소마다 생성자를 호출한다는 것입니다. delete[]은 소멸자에 대해서도 동일합니다.

게재 위치 new을 사용 중이고 전체 지점이 누락 된 생성자 및 소멸자를 수동으로 호출하고 있습니다.

+0

당신을 이해할 수 없기 때문에 더 설명해 주시겠습니까? 나는 새로운 것을 사용하지 않고 [] 의도적으로 삭제하고 싶다. case :: operator new를 객체 배열의 생성과 별도로 호출해야하는 경우 두 가지 접근 방식간에 차이점이 없습니다. – Martin

+0

OP가 그것을 알고있는 것처럼 그것은 나에게 보였다. 그러나 질문은 이전 질문과 정확히 일치하는 것으로 보입니다. 그래서 나는 투표를 끝내겠다고 결심했다. –

+0

@Martin,'malloc'의 대체물로'new'를 사용한다면 - 차이점은 없습니다. C++에서는 허용되지만 새로운 방식이 일반적으로 사용되는 방식이 아닙니다. – littleadv

3

둘 다 할당 함수이므로 요청한 크기 (여기서는 sizeof(J) * size)에 적합한 저장소를 반환해야합니다. 그래서 그들은 당신의 코드에 아무런 변화도주지 않습니다. 이들이 다를

operator new 비 배열에서 룩업되는 할당 기능이 있다는 새로운 표현 (예 new J) operator new[] 배열 새로운 표현에서 룩업되는 할당 함수 (반면 예 : new J[1]). 따라서 프로그램에 단일 개체에 대한 메모리 할당 전략과 다른 배열에 메모리를 할당하는 특정 전략이있는 경우 사용자 지정이 가능합니다. 이러한 맞춤 설정이 필요하지 않은 경우 operator new[]operator new에 위임 할 수 있습니다 (실제로는 구현에 의해 제공되는 할당 기능 (예 : ::operator new::operator new[])이 필수적입니다. 그래서 그 차이는 당신의 코드와 관련이 없습니다.

+0

'new J [1];은 일반적으로 할당 함수에서 sizeof (J) * 1' 바이트 이상을 요구할 것이라는 점에 주목할 필요가 있습니다. –

+0

@KerrekSB 저는 새로운 표현 (새로운 배치가 아닌)이 실제로 여기에 초점을 맞추고 있다고 생각하지 않습니다. –