2017-04-14 2 views
0

나는 우리 프로젝트에서 가능한 버그를 수정 해 주었고 void 포인터가 함수 중 하나에서 삭제된다는 것을 발견했다.C++에서 void 포인터 삭제하기

void 포인터를 삭제하지 않아도되고 삭제하기 전에 원래 형식으로 다시 캐스팅해야한다는 것을 알고 있습니다. 따라서 올바르게 소멸됩니다. 그러나 다음과 같이 코드는 다음과 같습니다

void someFunction() { 
    void *a[2] = {NULL, NULL}; 
    initializeFunction(a+0); 
    initializeFunction(a+1); 
    ... 
    //do something 
    ... 
    delete a[0]; 
    delete a[1]; 
} 

initializeFunction(void** b) { 
    *b = new unsigned char [size]; //size is calculated based on all the types and how many of each are used in innerFunction() 
    innerFunction((char *)*b); 
} 

innerFunction(char * x) { 
    *((int *)x) = intValue; 
    *((double *)(x += sizeof(int))) = doubleValue; 
    *((SomeClass *)(x += sizeof(doubleValue))) = aSomeClassObject; 
    *((AnotherClass *)(x += sizeof(aSomeClassObject))) = anAnotherClassObject; 
} 

가 나는 등의 사용을 발생 적이이로 접근하는 방법을 잘하지 않았다. 나는 모든 형언과 구원받는 다양한 형태와 혼동합니다. 실제 코드에는 innerFunction 유형이 더 있습니다. (원시 데이터 유형을 제외하고는 사용 된 모든 사용자 정의 클래스에는 배열 멤버 변수 만있었습니다.) 을 삭제하려면 (unsigned char*)으로 캐스팅하는 것이 간단합니까? 또는 기술적으로 메모리 내에 a이 가리키는 다른 유형이 있기 때문에 이것이 작동하지 않습니까? innerFunction()에 해당하는 삭제 작업을 수행해야합니까?

+3

내 권장 사항 :이 코드에서 최대한 빨리 실행하십시오. 그것은 모든 곳에서 정의되지 않은 행동을합니다. 이것이 코드 기반의 품질을 나타내는 것이라면, 정착 가능성의 관점을 넘어선 것 같습니다. –

+0

프로그래머가 그가 동적 배열을 삭제한다고 생각했다고 생각합니다. –

+0

@JasonR 할 수 있으면 해 둡니다. :(코드를 리팩터링 할 계획이 있지만 어려울 것입니다 ... – yushi

답변

1

가능한 경우이 코드를 변경하여 필요한 모든 하위 개체가 포함 된 struct을 사용하십시오.

사용되는 모든 유형이 POD이고 맹목적으로 정렬 문제가 없다고 가정하고 컴파일러가 엄격한 앨리어싱 트랩에 속하지 않는다고 가정하면 그렇습니다. 삭제를

으로 변경할 수 있습니다
delete[] static_cast<unsigned char*>(a[0]); 
delete[] static_cast<unsigned char*>(a[1]); 

약간 더 안전한 동작입니다.

0

void 포인터 삭제시 문제는 destuctors가 호출되지 않는다는 것입니다. 따라서 소유 포인터를 리턴하는 함수가 있다면, 그것을 소멸시키는 함수가 있어야합니다.