나는 우리 프로젝트에서 가능한 버그를 수정 해 주었고 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()
에 해당하는 삭제 작업을 수행해야합니까?
내 권장 사항 :이 코드에서 최대한 빨리 실행하십시오. 그것은 모든 곳에서 정의되지 않은 행동을합니다. 이것이 코드 기반의 품질을 나타내는 것이라면, 정착 가능성의 관점을 넘어선 것 같습니다. –
프로그래머가 그가 동적 배열을 삭제한다고 생각했다고 생각합니다. –
@JasonR 할 수 있으면 해 둡니다. :(코드를 리팩터링 할 계획이 있지만 어려울 것입니다 ... – yushi