2009-11-17 6 views
7

C++ 배열 삭제 연산자 구문

Foo* array = new Foo[N];

그러나 때때로 다음과 같이 보았습니다.

delete[N] array;

컴파일과 작업 (적어도 msvc2005 이상)에서 보이는 것처럼, 나는 궁금해합니다. 어떻게해야할까요? 왜 다른 방식으로 컴파일합니까?

답변

13

이 MSDN 링크 : delete[N] operator을 확인할 수 있습니다. 값은 무시됩니다.

내가 VC9에이 샘플 코드를 시도 편집 :

int test() 
{ 
    std::cout<<"Test!!\n"; 
    return 10; 
} 

int main() 
{ 
    int* p = new int[10]; 
    delete[test()] p; 
    return 0; 
}; 

출력은 다음과 같습니다 테스트!

따라서식이 계산되지만 반환 값은 무시됩니다. 나는 적어도이 말을하는 데 놀랍다. 나는 이것이 필요한 이유를 생각할 수 없다.

+0

+1. 유용한 정보 –

+0

그것은 [2N] 배열을 삭제할 수 있음을 의미합니까? 그게 컴파일 것입니다 –

+0

고마워,이 내가 찾고 있던 것입니다. – raven

5

delete[] array;은 올바른 형식입니다.

4

올바른 방법은 delete[] array;입니다. 나는 심지어 delete[N] array;이 컴파일 될지조차 몰랐다.

+1

VC9에서 '경고 C4208 : 비표준 확장이 사용됨 : delete [exp] - exp 평가되었지만 무시 됨'으로 컴파일됩니다. – Naveen

+1

이것은 (1) 유효하지 않은 C++이고 (2) 'N'표현은 평가되지만 무시됩니다. 그건별로 관련이 없지만'delete [N ++] array; '라고 썼다면 어떻게되는지 설명합니다. - N이 처음으로 증가하고 무시됩니다. – MSalters

+0

정말, 처음에는 무시한 다음 증가시킵니다. – raven

5

두 번째 케이스의 적합 여부는 오류 발생 가능성이 적은 첫 번째 케이스를 사용하는 것이 좋습니다.

Visual Studio는 여러 가지를 컴파일해야합니다.

+4

"Visual Studio는 컴파일해야하는 많은 것들을 컴파일합니다." 아멘. – sbi

10

delete [N] array은 유효하지 않습니다. C++ 표준에서는 정의되어 있지 않습니다. 5.3.5 절에서는 삭제 표현식을 delete expr 또는 delete [] expr으로 정의하고 있습니다. gcc (버전 4.1.2)에서는 컴파일되지 않습니다. Visual C++로 컴파일하는 이유는 Microsoft에 문의하십시오.

+0

어떤 C++ 표준입니까? 그리고 링크/참조가 있습니까? – Kissaki

+1

@Kissaki : 합법적으로 온라인으로 사용할 수없는 C++ 03을 언급했을 것입니다. 그러나이 문구는 C++ 11과 매우 유사하며, 초안은 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf에 있습니다. –

+0

아, 고마워 .. – Kissaki

-2

작동하는 경우 비표준 확장 프로그램입니다.

delete [] array; 

은 올바른 형식입니다.

delete array; 

가끔은 작동하지만 구현에 따라 다릅니다 (따라서 잘못되었습니다).

+1

두 번째 폼 (괄호 안 함)의 동작은 배열이 아닌 포인터에 대해 명확하게 정의됩니다. 배열에 대한 동작은 다릅니다. 어쨌든 누군가가 당신을 싫어하는 이유라고 생각합니다. –

+1

'delete array'는 프로그램을 크래시하지 않는다는 것을 의미하지 않는다면, 어떤 의미에서든 "작동"하지 않습니다. 첫 번째 장소에 할당 된 모든 메모리를 회수하지 않으며, 크래시가 발생하지 않으면 배열의 첫 번째 오브젝트에서만 소멸자를 실행합니다. (만약 당신이'new Foo [0]'을했다면 에러가 될 것입니다.) – Bill

+1

@Bill : 코멘트를 다운시킬 수 있으면 좋겠습니다. 귀하의 진술은 때로는 사실 일 수도 있고 때로는 그렇지 않을 수도 있습니다. 여기를 참조하십시오 : http://stackoverflow.com/questions/1553382/1553407#1553407 및 내 의견은 여기에 : http://stackoverflow.com/questions/1553382/1553391#1553391 – sbi

4

첫 번째 요점 : new 또는 delete의 배열 형식을 사용하여 시작하기에 거의 좋은 이유가 없습니다. 대신 std :: vector (또는 다른 컨테이너)를 사용하십시오.

두 번째 : C++의 어두운 시대에 다시 삭제하려는 배열의 크기를 지정해야 했으므로 x = new T[N]을 사용하는 경우 일치하는 삭제는 delete [N] x입니다. 명시 적으로 크기를 지정해야한다는 요구 사항은 전에 제거되었지만 일부 컴파일러 (특히 이전 코드와의 역 호환성을 고려하는 컴파일러)는 여전히 허용합니다.

오래된 컴파일러 (20 세 이상인 사람)와 호환성을 유지해야하는 경우가 아니면 사용해서는 안됩니다. 그런 다음 다시 컴파일러와 호환되도록 유지해야 할 필요가 없으면 표준 컨테이너를 지원하지 않으므로 새 배열 형식을 사용하거나 처음부터 삭제하면 안됩니다. 그냥 멈춰!

+0

역사 수업을 보내 주셔서 감사합니다. 그런 다음 동적 컨테이너 배열을 제 3 자 라이브러리에 전달해야한다면, 표준 컨테이너를 사용하는 올바른 방법이 될까요? – raven

+0

벡터를 사용하십시오. 주소/길이를 전달해야 할 때 & vec [0] 및 vec.size()를 사용하십시오. –

+0

+1 : 표준의 sep '94 초안에서 구문은 이미 'delete []'입니다. 그리고 같은 해에 Design and Evolution (p218)은이 구문이 "너무 오류를 범하기 쉽다는 것을 입증 했으므로 요소 수를 추적해야하는 부담이 대신 구현에있었습니다."라는 의견을 밝혔습니다. –