Я работаю над своей структурой цифровой обработки сигналов. Чтобы обеспечить интерфейс обмена данными, я обертываю все буферы в классе Data, который имеет механизм GC, основанный на подсчете ссылок (система достаточно проста, поэтому я считаю, что ref count может справиться с этим).
Это работает так:
Однако я обнаружил, что в моей программе есть утечка памяти.
Для отладки я добавил статические переменные m_alloccount и m_freecount в класс Data для записи времени выделения и освобождения. Затем я приостанавливаю выполнение в случайное время, только обнаруживая, что между этими двумя цифрами есть небольшая разница.
Например. в разных испытаниях:
Trial 1 2 3 4
m_alloccount 12 924 34413 364427
m_freecount 11 923 34412 364425
Но дело в том, что использование памяти все еще растет. Я считаю, что все распределение памяти связано с классом данных. На самом деле не могу понять причину сейчас.
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;
}
}
По моему опыту, утечка памяти всего одна или две, независимо от количества внутренних операций, указывает на утечку входной или выходной переменной. Проверьте учетную последовательность внешнего интерфейса вашей системы.
std::shared_ptr
это хорошо, потому что, будучи стандартным, он автоматически подходит в качестве внешнего интерфейса. Пользователь может взаимодействовать с пересчитанными объектами, не зная деталей управления, определенных DSP
,
Кроме этого, мы мало что можем сделать, чтобы понять, что происходит в вашей программе.
Как вы поддерживаете свои счетчики? Если ваш счетчик декремент / тест не является атомарным, вы можете просочиться декременты что помешало бы объекту когда-либо достичь повторного счета 0.
Шаг 2. Добавьте n ссылок при отправке.
Модули гарантированно будут отправлены? Основываясь на вашем простом алгоритме, созданный модуль, который не был отправлен, не имеет механизма, с помощью которого его счетчик ссылок будет уменьшаться и удаляться.