如何从成员函数中释放对象?

时间:2014-08-07 22:41:29

标签: c++ c++11 memory-management

让我今天有一个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()分配的内存。

1 个答案:

答案 0 :(得分:1)

所以我的问题是:当m_Ref达到0且对象被破坏并解除分配时,先前分配的内存是否被释放?

简单回答:是的。 “free”和“deallocate”意思相同。