Foo* array = new Foo[N];
그러나 때때로 다음과 같이 보았습니다.
delete[N] array;
컴파일과 작업 (적어도 msvc2005 이상)에서 보이는 것처럼, 나는 궁금해합니다. 어떻게해야할까요? 왜 다른 방식으로 컴파일합니까?
Foo* array = new Foo[N];
그러나 때때로 다음과 같이 보았습니다.
delete[N] array;
컴파일과 작업 (적어도 msvc2005 이상)에서 보이는 것처럼, 나는 궁금해합니다. 어떻게해야할까요? 왜 다른 방식으로 컴파일합니까?
이 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;
};
출력은 다음과 같습니다 테스트!
따라서식이 계산되지만 반환 값은 무시됩니다. 나는 적어도이 말을하는 데 놀랍다. 나는 이것이 필요한 이유를 생각할 수 없다.
delete[] array;
은 올바른 형식입니다.
올바른 방법은 delete[] array;
입니다. 나는 심지어 delete[N] array;
이 컴파일 될지조차 몰랐다.
두 번째 케이스의 적합 여부는 오류 발생 가능성이 적은 첫 번째 케이스를 사용하는 것이 좋습니다.
Visual Studio는 여러 가지를 컴파일해야합니다.
"Visual Studio는 컴파일해야하는 많은 것들을 컴파일합니다." 아멘. – sbi
delete [N] array
은 유효하지 않습니다. C++ 표준에서는 정의되어 있지 않습니다. 5.3.5 절에서는 삭제 표현식을 delete expr
또는 delete [] expr
으로 정의하고 있습니다. gcc (버전 4.1.2)에서는 컴파일되지 않습니다. Visual C++로 컴파일하는 이유는 Microsoft에 문의하십시오.
작동하는 경우 비표준 확장 프로그램입니다.
delete [] array;
은 올바른 형식입니다.
delete array;
가끔은 작동하지만 구현에 따라 다릅니다 (따라서 잘못되었습니다).
두 번째 폼 (괄호 안 함)의 동작은 배열이 아닌 포인터에 대해 명확하게 정의됩니다. 배열에 대한 동작은 다릅니다. 어쨌든 누군가가 당신을 싫어하는 이유라고 생각합니다. –
'delete array'는 프로그램을 크래시하지 않는다는 것을 의미하지 않는다면, 어떤 의미에서든 "작동"하지 않습니다. 첫 번째 장소에 할당 된 모든 메모리를 회수하지 않으며, 크래시가 발생하지 않으면 배열의 첫 번째 오브젝트에서만 소멸자를 실행합니다. (만약 당신이'new Foo [0]'을했다면 에러가 될 것입니다.) – Bill
@Bill : 코멘트를 다운시킬 수 있으면 좋겠습니다. 귀하의 진술은 때로는 사실 일 수도 있고 때로는 그렇지 않을 수도 있습니다. 여기를 참조하십시오 : http://stackoverflow.com/questions/1553382/1553407#1553407 및 내 의견은 여기에 : http://stackoverflow.com/questions/1553382/1553391#1553391 – sbi
첫 번째 요점 : new 또는 delete의 배열 형식을 사용하여 시작하기에 거의 좋은 이유가 없습니다. 대신 std :: vector (또는 다른 컨테이너)를 사용하십시오.
두 번째 : C++의 어두운 시대에 다시 삭제하려는 배열의 크기를 지정해야 했으므로 x = new T[N]
을 사용하는 경우 일치하는 삭제는 delete [N] x
입니다. 명시 적으로 크기를 지정해야한다는 요구 사항은 전에 제거되었지만 일부 컴파일러 (특히 이전 코드와의 역 호환성을 고려하는 컴파일러)는 여전히 허용합니다.
오래된 컴파일러 (20 세 이상인 사람)와 호환성을 유지해야하는 경우가 아니면 사용해서는 안됩니다. 그런 다음 다시 컴파일러와 호환되도록 유지해야 할 필요가 없으면 표준 컨테이너를 지원하지 않으므로 새 배열 형식을 사용하거나 처음부터 삭제하면 안됩니다. 그냥 멈춰!
역사 수업을 보내 주셔서 감사합니다. 그런 다음 동적 컨테이너 배열을 제 3 자 라이브러리에 전달해야한다면, 표준 컨테이너를 사용하는 올바른 방법이 될까요? – raven
벡터를 사용하십시오. 주소/길이를 전달해야 할 때 & vec [0] 및 vec.size()를 사용하십시오. –
+1 : 표준의 sep '94 초안에서 구문은 이미 'delete []'입니다. 그리고 같은 해에 Design and Evolution (p218)은이 구문이 "너무 오류를 범하기 쉽다는 것을 입증 했으므로 요소 수를 추적해야하는 부담이 대신 구현에있었습니다."라는 의견을 밝혔습니다. –
+1. 유용한 정보 –
그것은 [2N] 배열을 삭제할 수 있음을 의미합니까? 그게 컴파일 것입니다 –
고마워,이 내가 찾고 있던 것입니다. – raven