使用C ++实现引用计数

时间:2013-11-17 05:29:32

标签: c++ memory-leaks reference-counting

我正在研究我的数字信号处理框架。为了提供数据交换接口,我将所有缓冲区包装在一个Data类中,该类具有基于引用计数的GC机制(系统很简单,所以我相信ref count可以处理这个)。

它的工作原理如下:

  1. 构造数据实例时,会将其引用计数设置为零。
  2. 将实例分派给N个DSP模块时,将N添加到其引用计数。
  3. 当DSP模块完成实例时,它会减少引用计数。
  4. 当参考计数减少到零时,删除此项;
  5. 但是我发现程序中存在内存泄漏。

    为了调试,我将静态变量m_alloccount和m_freecount添加到Data类以记录分配和释放的时间。然后我随机暂停执行,只发现两个数字之间只有轻微差异。

    E.g。在不同的试验中:

    Trial         1   2    3      4
    m_alloccount  12  924  34413  364427
    m_freecount   11  923  34412  364425
    

    但事实是内存使用量仍在增长。我相信所有内存分配都绑定到Data类。真的无法弄清楚现在的原因。

    int Data::m_alloctime=0;
    int Data::m_freetime=0;
    
    Data::Data(DataPinOut*parent, int type, int size)
    :m_ptr(NULL)
    ,m_parent(parent)
    ,m_refcnt(0)
    ,m_type(type)
    ,m_size(size)
    {
        if(size>0)
            m_ptr=new char[TypeSizeLookup()*size];
        m_alloctime++;
    }
    
    Data::~Data()
    {
        delete [] (char*)m_ptr;
        m_freetime++;
    }
    
    void Data::Delete()
    {
        std::lock_guard<std::mutex>*lock=new std::lock_guard<std::mutex>(m_mutex);
    
        if(m_refcnt>1)
        {
            m_refcnt--;
            delete lock;
        }
        else
        {
            delete lock;
            delete this;
        }
    }
    

3 个答案:

答案 0 :(得分:2)

根据我的经验,无论内部操作量多少,只有一两个内存泄漏表明输入或输出变量泄漏。检查系统外部接口的记帐一致性。

std::shared_ptr很好,因为它是标准的,它自动适合作为外部接口。用户可以在不知道DSP定义的管理细节的情况下与重新计算的对象进行交互。

除此之外,我们无法做很多事情来直觉了解你的计划中发生的事情。

答案 1 :(得分:0)

你是如何维护你的柜台的?如果你的计数器减量/测试不是原子的,你可能会泄漏减量,这会阻止对象达到引用计数0。

答案 2 :(得分:0)

步骤2.分派时添加n个引用。

是否保证会发送模块?基于您的简单算法语句,未调度的已创建模块没有机制,其引用计数将减少并被删除。