2012-06-09 56 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(); 
}