我正在使用boost shared_ptr和我自己的内存管理器这样的(剥离示例,我希望它没有错误):
class MemoryManager
{
public:
/** Allocate some memory.*/
inline void* allocate(size_t nbytes)
{
return malloc(nbytes);
}
/** Remove memory agian.*/
inline void deallocate(void* p)
{
free(p);
}
};
MemoryManager globalMM;
// New operators
inline void* operator new(size_t nbytes, ogl2d::MemoryManagerImpl& mm)
{
return globalMM.allocate(nbytes);
}
// Corresponding delete operators
inline void operator delete(void *p, ogl2d::MemoryManagerImpl& mm)
{
globalMM.deallocate(p);
}
/** Class for smart pointers, to ensure
* correct deletion by the memory manger.*/
class Deleter
{
public:
void operator()(void *p) {
globalMM.deallocate(p);
}
};
我正在使用它:
shared_ptr<Object>(new(globalMM) Object, Deleter);
但现在我意识到了。如果shared_ptr删除了我的onject,它会调用Deleter :: operator()并删除对象。但析构函数不会被调用...
我该如何更改?
答案 0 :(得分:8)
因为删除器应该销毁对象:
class Deleter
{
public:
void operator()(Object *p) {
p->~Object();
globalMM.deallocate(p);
}
};
编辑:我的删除器错了,修复了
答案 1 :(得分:0)
您可以显式调用析构函数(这意味着Deleter
可能应该收到T *
而不是void *
)。请注意,您提供的代码实际上并未使用展示位置new / delete,因此我的回答仅对此特定示例有意义。