Portál AbcLinuxu, 10. května 2025 03:06

Dotaz: Uvolnění paměti způsobí SIGSEGV

Jardík avatar 31.7.2006 20:58 Jardík | skóre: 40 | blog: jarda_bloguje
Uvolnění paměti způsobí SIGSEGV
Přečteno: 178×
Odpovědět | Admin
Potřeboval bych poradit, kde dělám chybu. V následujícím kódu dojde k neoprávněnému přístupu do paměti při volání funkce free():
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).
Věřím v jednoho Boha.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Jardík avatar 31.7.2006 21:07 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Uvolnění paměti způsobí SIGSEGV
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jsem ale vůl. ::free(pointer) vyřešilo problém :-).
Věřím v jednoho Boha.
31.7.2006 21:13 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Uvolnění paměti způsobí SIGSEGV
Odpovědět | | Sbalit | Link | Blokovat | Admin

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.

Jardík avatar 31.7.2006 22:06 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Uvolnění paměti způsobí SIGSEGV
Docházelo jen k menší rekurzi :-)
Rezervu jsem si nechával (viz. bufferSize).
Věřím v jednoho Boha.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.