我正在研究我的数字信号处理框架。为了提供数据交换接口,我将所有缓冲区包装在一个Data类中,该类具有基于引用计数的GC机制(系统很简单,所以我相信ref count可以处理这个)。
它的工作原理如下:
但是我发现程序中存在内存泄漏。
为了调试,我将静态变量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;
}
}
答案 0 :(得分:2)
根据我的经验,无论内部操作量多少,只有一两个内存泄漏表明输入或输出变量泄漏。检查系统外部接口的记帐一致性。
std::shared_ptr
很好,因为它是标准的,它自动适合作为外部接口。用户可以在不知道DSP
定义的管理细节的情况下与重新计算的对象进行交互。
除此之外,我们无法做很多事情来直觉了解你的计划中发生的事情。
答案 1 :(得分:0)
你是如何维护你的柜台的?如果你的计数器减量/测试不是原子的,你可能会泄漏减量,这会阻止对象达到引用计数0。
答案 2 :(得分:0)
步骤2.分派时添加n个引用。
是否保证会发送模块?基于您的简单算法语句,未调度的已创建模块没有机制,其引用计数将减少并被删除。