gpt4 book ai didi

c++ - 使用重载放置新/删除提升 shared_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:23 25 4
gpt4 key购买 nike

我像这样将 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 删除了我的对象,它会调用 Deleter::operator() 并删除对象。但是析构函数不会被调用...

我怎样才能改变这个?

最佳答案

因为删除器应该销毁对象:

class Deleter
{
public:
void operator()(Object *p) {
p->~Object();
globalMM.deallocate(p);
}
};

编辑:我的删除器有误,已修复

关于c++ - 使用重载放置新/删除提升 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4182277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com