2011-11-29 3 views
2

이들 중 어느 것을 사용해야합니까?char *로 캐스트 된 문자 배열을 삭제합니까?

char *ex = new char[255]; 
// code 
delete [] ex; 

또는

char *ex = new char[255]; 
// code 
delete [] (char *) ex; 

나는 캐스트가 필요하지 않다고 생각하고 있지만 실제로 삭제에 어떤 영향을 미칠까요?

+1

캐스팅 아무것도하지 않습니다,하지만 피연산자의 유형'[]'두 경우 모두'의 char * '입니다 삭제할 ​​수 있기 때문에 한 경우에도 두 가지 예는 여전히 동일하게 동작한다. – Jon

답변

4
char *ex = new char[255]; 
// code 
delete [] ex; 

캐스트는 필요하지 않습니다. 캐스트는 효과가 없습니다.

C++ 표준에서는 변환을 수행 할 필요가 없습니다. 다음은 참고 자료입니다.

제 §3.7.3.2.3 :

널 포인터 값이 될 수있는 표준 라이브러리에서 제공되는 해제 기능들 중 하나에 공급되는 제 1 인수의 값; 그렇다면 할당 해제 함수를 호출해도 아무런 효과가 없습니다. 표준 라이브러리의 operator delete(void*)에 제공된 값은 표준 라이브러리의 이전 호출 operator new(size_t) 또는 operator new(size_t, const std::nothrow_t&)에 의해 리턴 된 값 중 하나가되어야하며 표준 라이브러리의 연산자 delete[](void*)에 제공된 값은 값 이전 라이브러리가 operator new[](size_t) 또는 operator new[](size_t, const std::nothrow_t&) 인 표준 라이브러리에서 리턴됩니다.

4

효과가 없으며 효과가 없습니다. char*char* 번으로 전송 중입니다.

0

delete []는 많은 개체를 파괴 (또는 파괴) 한 다음 메모리를 해제합니다. 유형이 객체가 아닌 경우 소멸자를 호출하지 않고 메모리를 해제합니다. 이것은 좋은 것 :

class some_class 
{ 
     some_class(int); 
}; 

.... 
some_class *p = new some_class[[2]](0)(1); 

delete[] p; // delete calculates how many objects where created, and call destructors of all objects, then frees the memory (which is twice sizeof(some_class) 
관련 문제