2012-06-09 57 views
0

在我的自定義堆棧分配器中,我在程序啓動時使用malloc()分配了大量內存,然後在程序關閉I free()處分配了所有內存。在自定義堆棧分配器中釋放內存

所以基本上它看起來像這樣:

//start up 
m_pInitialPosition = malloc(STACK_SIZE); 

//shutdown 
free(m_pInitilaPosition); 

當我需要創建一個新的對象我打電話allocateNew()

Actor* pActor = getStackAllocator().allocateNew<Actor>(); 
*pActor = Actor(); 

這是allocateNew()樣子:

template <class T> 
T* allocateNew() 
{ 
    //allocate returns void* 
    return new (allocate(sizeof(T), __alignof(T))) T; 
} 

發生問題(_BLOCK_TYPE_IS_VALID(pHead-> nBlock使用異常)如果我叫:

delete pActor; 

如果我只是刪除了這一行的問題就不存在了,也沒有內存泄漏,因爲我還是叫free()在堆棧中分配,但演員的析構函數不叫...

那麼,我可以改變以確保析構函數被調用?

+0

'allocateNew'的取消分配補碼是什麼樣的?那將是你需要調用析構函數的地方。 –

+0

來自第一個'malloc'調用的內存在哪裏被使用?看起來你只是爲'pActor'分配新的內存。 'malloc'ed內存在哪裏被使用?爲什麼你首先使用'malloc'?你應該使用'new'和'delete'。 'malloc'不知道對象或析構函數。 – Linuxios

+0

@ Linux_iOS.rb.cpp.c.lisp.m.sh allocate()方法返回一個指向使用malloc()分配的內存的指針,所以allocateNew()方法內的new()並不真正分配new記憶。 –

回答

2

當您撥打delete時,pActor所指向的對象將被破壞,並且內存將使用默認的釋放器(可能是free())釋放,而不是您的。由於該對象已由您的分配器分配,因此無法工作。

定義一個新的方法來處理對象刪除像這樣的:

template<class T> void deleteObject(T *obj) { 
    if (obj!=nullptr) { // do nothing is obj is null 
     obj->~T(); // call the object's destructor 
     deallocate(obj); // your method to handle deallocation in your 'memory pool' 
    } 
} 

而且通過更換您的刪除:

getStackAllocator().deleteObject(pActor); 

本文介紹瞭如何製作一個自定義的內存分配器:http://bitsquid.blogspot.fr/2010/09/custom-memory-allocation-in-c.html


此外,我對您的代碼有疑問。這些線應該做什麼?

Actor* pActor = getStackAllocator().allocateNew<Actor>(); 
*pActor = Actor(); 

1-如果allocateNew()執行兩種分配&默認結構,它是確定,但第二行是沒用?如果allocateNew()僅執行分配而不初始化對象,則第二行是錯誤的:它在未初始化的對象上調用賦值運算符。

2

delete pActor不適合配置new。 「撤銷」的對象建設new (allocate(sizeof(T), __alignof(T))) T需要調用析構函數而已,不要使用delete這也將嘗試通過pActor

例如在位置指針釋放內存到

pActor->~Actor(); 

你或許應該在你的堆棧分配類的成員函數包裝這,以便它的客戶不必神奇地知道如何解除分配,你給他們,並給你的自由,更新對象的分配器的實現。

E.g.

template <class T> 
void deallocate(T* t) 
{ 
    t->~T(); 
}