2017-04-14 93 views
0

我的任務是修復我們項目中的一些可能的錯誤,並發現在其中一個函數中正在刪除一個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()嗎?

+3

我的建議:儘可能快地運行,遠離此代碼。它在各地都有不確定的行爲。如果這代表了代碼庫的質量,它可能超出了可修復性。 –

+0

我認爲程序員認爲他正在刪除一個動態數組:) –

+0

@JasonR我會盡我所能。 :(有計劃重構代碼,但這將是困難的... – yushi

回答

1

如果可能,更改此代碼以使用包含所有必要子對象的struct

如果我們繼續檢查所有使用的類型是POD並且盲目地假定沒有對齊問題並且編譯器沒有陷入任何嚴格的別名陷阱,那麼是的,您可以將刪除更改爲

delete[] static_cast<unsigned char*>(a[0]); 
delete[] static_cast<unsigned char*>(a[1]); 

並且具有稍微安全的行爲。

0

刪除空指針的問題是不調用去迷路者。所以如果你有一個返回一個擁有指針的函數,你應該有一個破壞它的函數。