2013-04-30 74 views
0

我試圖將一些代碼移植到Ubuntu服務器上的新G ++。我不確定這段代碼試圖做什麼,但快速瀏覽一下,它試圖刪除與指針相關的內存。不會刪除指針

class mem_block 
    { 
    public: 
     class mem_block* next; 
     void*    pntr; 
     int     size; 

    mem_block(int i) { 
     record_new(sizeof(mem_block), MEM_MEMORY); 
     size = i; 
     pntr = new char[size]; 
     return; 
     } 

    ~mem_block() { 
     record_delete(sizeof(mem_block), MEM_MEMORY); 
     delete *pntr; // Troubled line. 
     return; 
     } 
    }; 

現在我試過刪除[] pntr; (就像它原來的那樣),它是當前的形式,等等......我不想評論這些代碼,因爲這會造成大量的內存泄漏,我敢肯定。

任何想法?這讓我無法刪除無效*在這種情況下,無效*是不是一個指針到對象類型

+0

'delete [] pntr;'也許? – talonmies 2013-04-30 06:14:46

回答

3

您需要刪除指針本身不是它的參考價值,它應該是:

delete [] (char*)pntr; 
+0

對不起,試過了。 memory.h:在析構函數'mem_block ::〜mem_block()'中: memory.h:90:15:警告:刪除'void *'是未定義的[默認啓用] – Demortes 2013-04-30 05:52:54

+0

@Demortes只要你的void *指向一個原始類型,它可以安全地刪除鏈接中討論的:http://stackoverflow.com/questions/941832/is-it-safe-to-delete-a-void-pointer – 2013-04-30 05:57:30

+0

@Demortes你爲什麼使用' void *'在第一位?爲什麼一個指針呢? – juanchopanza 2013-04-30 06:08:59

2

從C++標準[第5.3.5(3)節]: 「在第二種替代方法(刪除數組)中,如果要刪除的對象的動態類型與其靜態類型不同,則行爲未定義。

在你的情況下,pntr的動態類型是char *,因此使用C++ casting來顯式地通知編譯器它的類型。

delete [] (static_cast<char*>(pntr));