【发布时间】:2013-11-17 05:29:32
【问题描述】:
我正在研究我的数字信号处理框架。为了提供数据交换接口,我将所有缓冲区包装在一个 Data 类中,该类具有基于引用计数的 GC 机制(系统很简单,所以我相信 ref count 可以处理这个问题)。
它是这样工作的:
- 在构造 Data 实例时,它会将其引用计数设置为零。
- 当实例被分派到 N 个 DSP 模块时,将 N 添加到它的引用计数中。
- 当 DSP 模块完成实例时,它会减少引用计数。
- 当引用计数减少到零时,它删除它;
但是我发现我的程序中存在内存泄漏。
为了调试,我在Data类中添加了静态变量m_alloccount和m_freecount来记录分配和释放的时间。然后我随机暂停执行,才发现这两个数字之间只有细微的差别。
例如在不同的试验中:
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;
}
}
【问题讨论】:
-
你用过
valgrind吗? -
这是多线程的吗?
-
交出
std::shared_ptr,不用担心自己的数量。 -
你看过
std::shared_ptr,C++11 中的标准引用计数工具吗? -
@babel92 你能告诉我们你是如何确定内存泄漏的吗?谢谢
标签: c++ memory-leaks reference-counting