我的任務是修復我們項目中的一些可能的錯誤,並發現在其中一個函數中正在刪除一個void指針。在C++中刪除空指針
我知道你不應該刪除一個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
在實際代碼中有更多類型。 (雖然也許值得注意的是,除了原始數據類型之外,所有用戶定義的類只使用了數組成員變量。)
爲了刪除a
,是否將其轉換爲(unsigned char*)
?或者這不起作用,因爲技術上a
指向的內存中有不同的類型?我需要刪除innerFunction()
嗎?
我的建議:儘可能快地運行,遠離此代碼。它在各地都有不確定的行爲。如果這代表了代碼庫的質量,它可能超出了可修復性。 –
我認爲程序員認爲他正在刪除一個動態數組:) –
@JasonR我會盡我所能。 :(有計劃重構代碼,但這將是困難的... – yushi