让我今天有一个Test类,它注册了一个工厂函数来构造对象。因为我需要在脚本引擎中嵌入这个对象。因此,工厂函数负责为对象分配内存并创建Test类的实例。
对象是引用计数,因此当计数器达到0时,它必须自毁并释放工厂函数分配的内存。它必须从成员函数执行此操作。
这是我正在尝试做的一个例子:
#include <memory>
#include <cstdio>
class Test
{
public:
typedef std::allocator<Test> Allocator;
Test()
: m_Ref(1)
{
// Constructing....
}
~Test()
{
// Destructing....
}
static Test *Create()
{
Allocator::pointer ptr = 0;
Allocator alloc;
try
{
ptr = alloc.allocate(1);
alloc.construct(ptr);
}
catch (const std::bad_alloc &ba)
{
// Propagate the error message to the script engine...
}
catch (...)
{
alloc.deallocate(ptr, 1);
ptr = 0;
// Propagate the error message to the script engine...
}
return ptr;
}
void AddRef()
{
m_Ref++;
}
void SubRef()
{
if (--m_Ref == 0)
{
Allocator alloc;
alloc.destroy(this);
alloc.deallocate(this, 1);
}
}
int RefSum()
{
return m_Ref;
}
private:
mutable int m_Ref;
};
int main(int argc, char** argv)
{
// Script would call
Test *ptr = Test::Create();
// Use the object (as an example)
printf("Ref count is: %d\n", ptr->RefSum());
// Now to release
ptr->SubRef();
// The object must not exist now...
printf("Ref count is: %d\n", ptr->RefSum());
return 0;
}
所以我的问题是:当m_Ref达到0且对象被破坏并解除分配时,先前分配的内存是否被释放?
如果没有,那么当m_Ref达到0时,如何释放用std :: allocator :: allocate()分配的内存。
答案 0 :(得分:1)
所以我的问题是:当m_Ref达到0且对象被破坏并解除分配时,先前分配的内存是否被释放?
简单回答:是的。 “free”和“deallocate”意思相同。