2015-01-07 3 views
0

다음은 내 테스트 클래스입니다배치 새의 메모리는 []

CASE_1를 : -

void* raw = operator new(4* sizeof(Base)); 
Base* b = static_cast<Base*>(raw); 

for(int i = 0; i < 4; i++) 
    new (&b[i]) Base(i); 

CASE_2 : -

void* raw = operator new[](4* sizeof(Base)); <<<<<<<<<<<<< 
Base* b = static_cast<Base*>(raw); 

for(int i = 0; i < 4; i++) 
    new (&b[i]) Base(i); 

CASE_1에서는 평 균 new을 사용하여 충분한 메모리를 할당했지만 Case_2에서는 new[]을 사용하여 할당했습니다. 내가 테스트로 모두 잘 사항 : -

for(int i = 0; i < 4; i++) 
{ 
    Base* b1 = b; 
    cout << (*(b1+i)).data; 
} 

는 그러나, 나는 혼란 스러워요 CASE_1 객체의 배열에 대한 메모리 할당을하는 올바른 방법인지. 두 접근 방식 모두 유사합니다. this page을 인용

+2

C++에서 배열을 할당하는 올바른 방법은 ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector)를 사용하는 것입니다. – Mgetz

+1

@Mgetz : 일반적으로 그렇습니다. 그러나 가끔은 할당 된 메모리를 초기화하는 비용을 피하기를 원하며'vector'로 그렇게 할 수있는 (잘 정의 된) 방법은 없습니다. –

+1

@MikeSeymour [나는 실제로 거기 있다고 믿는다.] (http : //en.cppreference. – Mgetz

답변

0

:

기본 정의는 new 연산자를 호출하여 메모리를 할당 : : : 연산자 새 (크기).

결과는 정확히 일치해야합니다. 두 행은 동일한 포인터를 리턴해야합니다.

@ Joachim Pileborg가 지적한대로 operator new을 피하고 더 간단한 new Base[4]을 사용해야합니다.

0

이 질문에 대답하는 것이 어려울 때 새로운 배치를 사용하기 전에 "정말 이상한 일"이 있어야한다는 것이 좋습니다. 그게 무엇인지 모른 채, 당신이하고있는 일이 "옳다"는 어떤 확신을 가지고 말하는 것은 어렵습니다.

둘 다 작동합니다.

세계 operator new[]을 사용하는 것은 무의미합니다. 전역에서 제공하는 모든 것 operator new은 다른 소스에서 할당하는 것과 같이 다른 작업을 수행하기 위해 오버로드 할 수있는 기능 (또는 프로그램의 일부 다른 코드)입니다. 따라서 아마도 큰 할당 인 경우 operator new[]을 사용하는 것이 약간 더 나은 방법이라고 생각할 수 있습니다. 그런 다음 나중에 프로그램 용도로 최적화 할 수 있습니다. 그러나 이것은 특정 목적을 위해 특정 할당자를 직접 사용하는 것과 비교할 때 상당히 무딘 수단입니다. 나는 그것이 일반적이라고 생각하지 않는다. 그러나 새로운 것을 사용하는 것은 새로운 에 전혀가 아니다.

또한 메모리를 해제하는 코드를 표시하지 않으므로 잘못 가져올 수있는 기회가 충분합니다. 일반적으로 각 요소의 소멸자를 차례로 호출해야하며 사용한 전역 연산자와 일치하는 전역 삭제 연산자를 호출해야합니다. 귀하의 특정 클래스에 대해 Base 실제로 파괴에 실패해도 해가 없지만 소멸자 호출을 생략하고 나중에 Base을 변경하면 문제가 발생할 수 있습니다.

+0

예 내가 언급 한 두 가지 중에서 더 나은 옵션 인 붙어있어 삭제를 위해 코드를 사용하지 않았습니다. 그 후에 만 ​​연산자 삭제 OR 연산자 delete []를 사용할지 결정할 수 있습니다. – ravi