Portál AbcLinuxu, 8. listopadu 2025 11:39
if(!m_pBuffer)
{
m_nAllocated = bufferSize;
m_pBuffer = Memory<T>::alloc(m_nAllocated);
m_nItems = 0;
}
else if(m_nItems+1 > m_nAllocated)
{
m_nAllocated += bufferSize;
T *newBuffer = Memory<T>::alloc(m_nAllocated);
Memory<T>::copy( newBuffer, m_pBuffer, m_nItems );
Memory<T>::free( m_pBuffer ); //zde nastává SIGSEGV
m_pBuffer = newBuffer;
}
m_pBuffer[m_nItems++] = item;
Funkce Memory<T>::free( T *pointer ) volá free(pointer).
::free(pointer) vyřešilo problém
.
Jednak bych zkontroloval, zda Memory<T>::alloc() volá malloc(), jednak zda není problém v tom, že m_pBuffer není inicializovaný. Jestli není problém v tomhle, asi bude potřeba použít debugger a zjistit, za jakých okolností přesně ten SEGV nastává.
Z čistě praktického hlediska bych pak doporučoval neprovádět tu (náročnou) realokaci po jednom prvku, ale nechat si trochu větší rezervu. Nebo rovnou použít některý kontejner ze standardní C++ knihovny.

Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.