2013-03-06 2 views
1

커다란 시스템 설정이지만 다소 단순합니다. void* 어레이에 데이터를 저장합니다. 정확성 정도에 따라 저장되는 데이터가 float 또는 double 사이에서 달라질 수 있습니다.C++ delete [] void * curiosity

방금 ​​delete [] data은 MinGW를 사용하여 warning: deleting 'void*' is undefined [enabled by default]을 발생시킵니다. datafloat* 또는 double* 일 경우 다른 변수를 알려주지 만 사용하는 데 문제가 있습니까?

다른 말로하면 메모리 누수 나 다른 오류/손상이 컴파일러에서 발견되지 않는 것에 대한 걱정없이 휴면 코드를 사용할 수 있습니까?

double* d_data = new double[length]; 
data = (void*)d_data; 
delete [] (float*)data; 
+3

대단히 많이 보인 코드는 [정의되지 않은 동작] (http://en.wikipedia.org/wiki/Undefined_behavior)을 호출합니다. – ildjarn

+1

IMHO - 당신이 캐스팅 할 때 당신은 보통 뭔가 잘못하고 있습니다. 조심스럽게 주조하십시오. –

+1

data = 새 부호없는 char [length * sizeof (double)]; delete [] (unsigned char *) 데이터; – cppguy

답변

3

확실히 중요합니다. delete[]에 사용하는 포인터는 할당 한 포인터와 동일한 유형이어야합니다. 따라서 double*으로 전송하는 것은 유효하지만 오류가 발생하기 쉽습니다. float*으로 캐스팅하면 정의되지 않은 동작이 발생합니다.

[클래스 유형의 단일 객체 (배열 아님)에는 예외가 있습니다. 기본 클래스에 가상 소멸자가있는 경우 인 경우 기본 클래스에 대한 포인터가 될 수 있습니다. 하지만 그건 나 배열에, double 같은 기본 유형에 적용되지 않습니다] 메모리 누수에 관해서는

을 :. 수동 메모리 관리 당신이 아무것도 결코 특히주의가 아니라면 항상는 메모리 누수의 위험을 수행하는 예외가 throw 될 가능성이 있습니다. 모든 동적 리소스를 관리하려면 RAII을 사용하는 것이 좋습니다.

+0

감사합니다. 호기심에 대한 답변이 나왔습니다. –

1

union을 사용하는 것이 좋습니다.

+0

새로운 데이터 형식을 정의하려고하지 않습니다. 저는 클래스, 구조체, Typedef, Enum, Unions에 익숙합니다. 할당 된 데이터를 삭제하는 것에 대해 궁금합니다. 그리고 float, int, double, char 또는 기타 기본 데이터 유형과 같이 해당 유형이 기본 유형일 때 데이터의 "유형"이 실제로 중요한지 여부.그것들 사이의 모든 변화는 실제로 얼마나 많은 양의 데이터가 있는지, 어떻게 해석하는지에 달려 있습니다. 그러나 그것을 삭제하는 것은 어떨까요? –

+0

그 경우에는 포인터의 데이터 유형에 따라 삭제할 바이트 크기가 결정됩니다. 부동 소수점은 32 비트를 취하고 64 비트를 두 배로 늘립니다. 만약 당신이 그것을 float * casted했다면 엘리먼트를 삭제할 것입니다 * 4 바이트, 캐스팅 된 경우 double * 그런 다음 요소를 삭제합니다 * 8 바이트. –

0

그렇습니다. 실제 데이터 길이와 같은 추가 메타 데이터를 잃어 버리거나 망쳐 버리는 경우가 있기 때문에 중요합니다 (다른 데이터 유형으로 캐스팅하는 것은 본질적으로 void*으로 남습니다). 본질적으로 정의되지 않은 동작 (다른 컴파일러 또는 버전이 다른 결과를 생성 할 수 있음)이므로 반드시 충돌하지 않아야합니다 (예 : delete [] data;도 컴파일러가 알지 못하면 누설 될 수 있습니다) delete data;을 사용할 수 있습니다.

호르헤, 당신은 그냥 그렇게 두 데이터 유형이 동일한 메모리를 공유 할 수 있습니다,이를 위해 노동 조합을 사용할 수 있습니다 제안으로

:

union my_union { 
    double d_double; 
    float d_float; 
}; 

컴파일러에 따라,이 구조체는 일반적으로 같은 크기가됩니다 가장 큰 데이터 유형 (이 경우 (및 32 비트 시스템에서)은 double의 경우 8 바이트, float의 경우 4 바이트이므로 전체 크기는 8 바이트가됩니다. 일종의 자동 변환에는 사용할 수 없다는 점을 명심하십시오.