2012-01-07 22 views
2

如果我從最初分配空間的位置刪除不同函數中的存儲空間,是否會得到未定義的行爲?C++從不同的函數中刪除存儲空間與分配空間的位置不同

typedef struct { 
    unsigned int Data1; 
    unsigned int Data2; 
    unsigned int Data3; 
}TData; 

void CreateStorage(void) 
{ 
    TData *TempData = new TData; 

    DeleteStorage((unsigned char*)TempData); 
} 

void DeleteStorage(unsigned char *StorageToDelete) 
{ 
    delete (TData*)StorageToDelete; 
} 
+0

否.............. – JosephH 2012-01-07 01:34:17

回答

1

[注:你不需要那麼投。]

+0

你的意思是「你不需要那個演員」?他分配了一個TData,沒有演員,他會刪除一個無符號的字符。如果靜態類型與動態類型不匹配,則在刪除時會出現未定義的行爲。 – 2012-01-07 02:28:47

+0

@DietmarKühl:這個問題已被編輯。原來,沒有'unsigned char *'任何地方... – 2012-01-07 02:29:59

+0

哦,我沒有注意到。 – 2012-01-07 02:31:22

3

從不同函數中分配和刪除內存是完全有效的。

0

不,沒關係。 爲什麼在DeleteStorage()中將StorageToDelete轉換爲(TData *)?

0

不,這很好,也不要鍵入你的結構。只要說struct TData { /*...*/ };

+0

我正在使用QT。存儲指針實際上作爲一個事件傳遞給另一個函數(發出signalDeleteStorage)。我不允許在信號事件中傳遞未定義的類型。因此,我將指針作爲已知類型的無符號字符傳遞。 TData是未知的,因此我通過它時將它轉換爲無符號字符。爲了確保編譯器知道要分配的內存大小,我將其轉換回原來的類型。這是不必要的? – user668773 2012-01-07 01:54:15

+1

對不起,我誤讀了;我會刪除第二點。的確,'delete'會調用析構函數,所以你應該給它正確的類型。不是因爲釋放內存(應該沒問題),而是因爲對象破壞。您應該將這樣的「無類型」指針作爲「void *」傳遞,並且只需簡單地說:'delete static_cast (StorageToDelete)'。 – 2012-01-07 01:57:35

+0

使用類型定義的結構的原因可能是由於壞習慣,但也可能是由於我的編程風格。我經常將結構作爲其他函數的指針。沒有太多的麻煩,我現在可以在傳遞指針時在函數參數列表中使用類型定義的結構。這樣在結構指針上操作時不需要強制轉換。當然,給出的例子不適用,因爲它是作爲unsigned char傳遞的,但在其他所有情況下,我將通過結構類型傳遞它。 – user668773 2012-01-07 02:05:04

0

只要您在同一個庫中進行分配和釋放,它將被安全地刪除。

但是,如果您在不同的庫中進行分配和釋放,有些事情需要注意。由於底層類定義在不同庫中可能不同,因此您需要確保使用相同的定義。

出現的一個非常常見的問題是,當您使用預編譯的開源C++庫並且您的程序和庫使用不同的C++運行時庫時,它有時會崩潰,而開源庫會取消分配一個STL容器實例已由程序分配,因爲該類在開源庫中的定義與您的定義不同。解決此問題的常用解決方法是使用您使用的編譯器重新編譯開源庫。

+0

我正在使用QT。存儲指針實際上是作爲事件傳遞給另一個函數的: – user668773 2012-01-07 01:46:34

+0

@ user668773如果存儲的析構函數僅在庫**中定義,那麼它將會很好** – JosephH 2012-01-07 01:53:39