Portál AbcLinuxu, 10. května 2025 03:06
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.