2014-02-18 34 views
0

我有一些代碼使用malloc/realloc爲類分配內存,然後再次使用free刪除它們。下面是什麼我的工作的摘錄:使用malloc/free與類

void NewSubInstances() 
    // Invoked by each worker thread to grow the subinstance array and 
    // initialize each new subinstance using a particular method defined 
    // by the subclass. 
{ 
    if (slavetotalspace >= totalobj) { return; } 
    //Remember current large size 
    G4int originaltotalspace = slavetotalspace; 
    //Increase its size by some value (purely arbitrary) 
    slavetotalspace = totalobj + 512; 
    //Now re-allocate new space 
    offset = (T *) realloc(offset, slavetotalspace * sizeof(T)); 
    if (offset == 0) 
    { 
     G4Exception("G4VUPLSplitter::NewSubInstances()", 
        "OutOfMemory", FatalException, "Cannot malloc space!"); 
     return; 
    } 
    //The newly created objects need to be initialized 
    for (G4int i = originaltotalspace; i < slavetotalspace; i++) 
    { 
     offset[i].initialize(); 
    } 
} 

void FreeSlave() 
    // Invoked by all threads to free the subinstance array. 
{ 
    if (!offset) { return; } 
    free(offset); 
    offset = 0; 
} 

我知道的malloc不會調用類的構造函數,但是這是由初始化函數處理。我的問題是:我如何處理釋放內存的方式,這種方式也會調用類的析構函數(類通常具有動態分配的內存,並且需要刪除它)?

謝謝!

+4

在C中,你沒有類,而在C++中,你不應該使用'malloc' /'free'。你想寫什麼,你爲什麼這樣做? –

+0

你沒有說你爲什麼不能使用new並自動刪除哪個構造函數/析構函數。這有什麼理由嗎? – Dabo

+0

即使你有一個'原始字節數組'(例如'char *'),它可能會導致你(可能是'純C'程序員)使用'* alloc',你可以使用'new'和'delete' 。只是一個遠射,但你可以使用'std :: vector '來表示'offset'。 –

回答

0

您可以使用:

void FreeSlave() 
{ 
    if (!offset) { return; } 
    for (G4int i = slavetotalspace; i != 0; --i) { 
     offset[i - 1].~T(); 
    } 
    free(offset); 
    offset = 0; 
} 
1

我該怎麼處理內存的方式,也將調用類的析構函數(類一般是動態分配的內存,將需要釋放刪除它)?

的回答你的問題是這樣的:

void FreeSlave() 
{ 
    if (!offset) 
    { return; } 
    // call destructors explicitly 
    for(G4int index = 0; index < slavetotalspace; ++index) 
     offset[index].~T(); 
    free(offset); 
    offset = 0; 
} 

這就是說,不要使用malloc/realloc的/自由的C++(沒有,甚至沒有,如果任何藉口到這裏)。雖然它可能會工作(對此不確定),但這些代碼很模糊/具有非顯而易見的依賴關係,易碎,難以理解,並且違反了最少突然出現的原則。另外,請不要將你的指針調用爲「偏移量」,也不要在C++中使用C風格的轉換(這是不好的做法)。

+0

根據提供的代碼,'offset'已經是'T *'類型,並且指針擁有'T'數組。 – Jarod42

+0

謝謝,我已更正了代碼。 – utnapistim

0

我會建議有一個destroy()方法...因爲你已經有initialize() ...調用析構函數的方法,儘管這是允許的,但真的很難看,感覺像是一個黑客(這是)。