<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Programmabsturz beim Rücksprung]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>bei mir macht die Klasse &quot;vector&quot; immer Fehler. Bei einer Debug-Kompileirung gibt es (der vector) mir Warnings aus, Funktioniert aber halbwegs. Bei einer Realease-Kompilierung sind die Warnings weg, aber beim Erzeugen von neuen Speicherplatz mit der Routine &quot;push_back&quot; stürtzt mir dann das Programm ab.</p>
<p>Desshalb wollte ich mir für mein Programm meinen eigenen Kontainer schreiben.<br />
Bei meinem Container gibt es Listen, also eine Mainliste, die ihrer seits Unterlisten erzeugen kann. In diese Unterlisten können dann Typen erzeugt werden.</p>
<p>So weit so gut, nun hab ich das Problem, dass beim &quot;Item&quot; löschen, alle folgenden Items neu &quot;ausrichten&quot; muss. Das Löschen übernimmt die Funktion &quot;erease&quot;, bei deren Rücksprung mein Programm abstürtzt.</p>
<p>Hier der Code:</p>
<pre><code>#include &lt;iostream.h&gt;
#include &lt;memory.h&gt;

template&lt;class T&gt; 
class CFastContainer  
{
public:
	CFastContainer() :
	  m_Mainlistsize(100) ,
	  m_Sublistsize(50)
	{
		m_nSublistCount = 0;
		m_nItemCount = 0;
		pMainlist = new T**[m_Mainlistsize];
		memset(pMainlist,NULL, m_Mainlistsize);

	//	CreateSublist();
	}
	  CFastContainer(unsigned int MainSize, unsigned int SubSize) :
	  m_Mainlistsize(SubSize) ,
	  m_Sublistsize(50)
	{
		m_nSublistCount = 0;
		m_nItemCount = 0;
		pMainlist = new T**[m_Mainlistsize];
		memset(pMainlist,NULL, m_Mainlistsize);

		CreateSublist();
	}

	~CFastContainer()
	{
		//alles löschen
		//mit sublisten anfengen
		for(unsigned int i = 0; i &lt; m_nSublistCount; i++)
			for(unsigned int j = 0; j &lt; m_Sublistsize; j++)
				if(pMainlist[i][j])
					delete pMainlist[i][j];

		i = 0;
		while( pMainlist[i] &amp;&amp; i &lt; m_Mainlistsize)
			delete[] pMainlist[i++] ;
		delete[] pMainlist;

	}

	unsigned int size()	{ return m_nItemCount; }

	void push_back(T &amp; data)
	{
		unsigned int listNr = m_nItemCount / m_Sublistsize;
		unsigned int SubItemsNr = m_nItemCount - (listNr * m_Sublistsize);

		if(! pMainlist[listNr])
			CreateSublist();

		pMainlist[listNr][SubItemsNr] = new T;
		*pMainlist[listNr][SubItemsNr] = data;
		m_nItemCount++;

	}

	T &amp; at(unsigned int index)
	{
		unsigned int listNr = GetListNr(index);
		unsigned int SubItemsNr = SubListNr(index);

		return *pMainlist[listNr][SubItemsNr];

	}

	T &amp; operator[] ( unsigned int index) { return at(index); }

//	bool pop_back();
	void erease( unsigned int index)
	{
		unsigned int listNr = GetListNr(index);
		unsigned int SubItemsNr = SubListNr(index);
		unsigned int listNr2;

		delete pMainlist[listNr][SubItemsNr];
		pMainlist[listNr][SubItemsNr] = NULL;
		m_nItemCount--;

		//von hinten aufrücken.........
		for(unsigned int i = index; i &lt; m_nItemCount-1; i++)
			pMainlist[ GetListNr(i) ][ SubListNr(i) ] = pMainlist[ GetListNr(i+1) ][ SubListNr(i+1) ];

		//Leere liste löschen
		listNr2 = GetListNr(m_nItemCount-1);
		if(listNr2 &lt; listNr)
		{
			delete[] pMainlist[listNr];
			pMainlist[listNr] = NULL;
		}	
	}
private:
	const unsigned int m_Mainlistsize;
	const unsigned int m_Sublistsize;
	unsigned int m_nSublistCount;
	unsigned int m_nItemCount;
	T *** pMainlist;

	bool CreateSublist()
	{
		if(m_nSublistCount &lt; (m_Mainlistsize -1 ))
		{
			pMainlist[m_nSublistCount++] = new T*[m_Sublistsize];
			memset(pMainlist[m_nSublistCount-1], NULL , m_Sublistsize);;
			return true;
		}
		return false;
	}

	unsigned int GetListNr(unsigned int index) { return index / m_Sublistsize; }
	unsigned int SubListNr(unsigned int index) { return index - ((index / m_Sublistsize) * m_Sublistsize); }

};

void main()
{
	CFastContainer&lt;int&gt; a;

	for(int i = 0; i &lt; 100;  i++)
		a.push_back(i);

	for( i = 0; i &lt; 100;  i++)
		cout &lt;&lt; a[i] &lt;&lt; endl;

	//for( i = 0; i &lt; 50;  i++)
	//{
	//	cout &lt;&lt; i &lt;&lt; &quot; ,,&quot; &lt;&lt; endl;
	//	a.erease(i);
	//}
	a.erease(0);
}
</code></pre>
<p>Kurzfassung:<br />
Beim Rückspsrung aus der Funktion erease stürtzt das Programm ab, mit der Meldung : &quot;BLOCK_TYPE_IS_VALID&quot; .</p>
<p>Irgentwo muss ich mir den Speicher Kaputt machen, aber ich kann nicht erkennen wo das passiert.</p>
<p>Ich bin über jede Hilfe dankbar.</p>
<p>Gruß Stu</p>
<p>PS.: Ich benutze VC++ 6.0.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/154318/programmabsturz-beim-rücksprung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 22:30:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154318.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 26 Jul 2006 10:16:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Programmabsturz beim Rücksprung on Wed, 26 Jul 2006 10:16:10 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>bei mir macht die Klasse &quot;vector&quot; immer Fehler. Bei einer Debug-Kompileirung gibt es (der vector) mir Warnings aus, Funktioniert aber halbwegs. Bei einer Realease-Kompilierung sind die Warnings weg, aber beim Erzeugen von neuen Speicherplatz mit der Routine &quot;push_back&quot; stürtzt mir dann das Programm ab.</p>
<p>Desshalb wollte ich mir für mein Programm meinen eigenen Kontainer schreiben.<br />
Bei meinem Container gibt es Listen, also eine Mainliste, die ihrer seits Unterlisten erzeugen kann. In diese Unterlisten können dann Typen erzeugt werden.</p>
<p>So weit so gut, nun hab ich das Problem, dass beim &quot;Item&quot; löschen, alle folgenden Items neu &quot;ausrichten&quot; muss. Das Löschen übernimmt die Funktion &quot;erease&quot;, bei deren Rücksprung mein Programm abstürtzt.</p>
<p>Hier der Code:</p>
<pre><code>#include &lt;iostream.h&gt;
#include &lt;memory.h&gt;

template&lt;class T&gt; 
class CFastContainer  
{
public:
	CFastContainer() :
	  m_Mainlistsize(100) ,
	  m_Sublistsize(50)
	{
		m_nSublistCount = 0;
		m_nItemCount = 0;
		pMainlist = new T**[m_Mainlistsize];
		memset(pMainlist,NULL, m_Mainlistsize);

	//	CreateSublist();
	}
	  CFastContainer(unsigned int MainSize, unsigned int SubSize) :
	  m_Mainlistsize(SubSize) ,
	  m_Sublistsize(50)
	{
		m_nSublistCount = 0;
		m_nItemCount = 0;
		pMainlist = new T**[m_Mainlistsize];
		memset(pMainlist,NULL, m_Mainlistsize);

		CreateSublist();
	}

	~CFastContainer()
	{
		//alles löschen
		//mit sublisten anfengen
		for(unsigned int i = 0; i &lt; m_nSublistCount; i++)
			for(unsigned int j = 0; j &lt; m_Sublistsize; j++)
				if(pMainlist[i][j])
					delete pMainlist[i][j];

		i = 0;
		while( pMainlist[i] &amp;&amp; i &lt; m_Mainlistsize)
			delete[] pMainlist[i++] ;
		delete[] pMainlist;

	}

	unsigned int size()	{ return m_nItemCount; }

	void push_back(T &amp; data)
	{
		unsigned int listNr = m_nItemCount / m_Sublistsize;
		unsigned int SubItemsNr = m_nItemCount - (listNr * m_Sublistsize);

		if(! pMainlist[listNr])
			CreateSublist();

		pMainlist[listNr][SubItemsNr] = new T;
		*pMainlist[listNr][SubItemsNr] = data;
		m_nItemCount++;

	}

	T &amp; at(unsigned int index)
	{
		unsigned int listNr = GetListNr(index);
		unsigned int SubItemsNr = SubListNr(index);

		return *pMainlist[listNr][SubItemsNr];

	}

	T &amp; operator[] ( unsigned int index) { return at(index); }

//	bool pop_back();
	void erease( unsigned int index)
	{
		unsigned int listNr = GetListNr(index);
		unsigned int SubItemsNr = SubListNr(index);
		unsigned int listNr2;

		delete pMainlist[listNr][SubItemsNr];
		pMainlist[listNr][SubItemsNr] = NULL;
		m_nItemCount--;

		//von hinten aufrücken.........
		for(unsigned int i = index; i &lt; m_nItemCount-1; i++)
			pMainlist[ GetListNr(i) ][ SubListNr(i) ] = pMainlist[ GetListNr(i+1) ][ SubListNr(i+1) ];

		//Leere liste löschen
		listNr2 = GetListNr(m_nItemCount-1);
		if(listNr2 &lt; listNr)
		{
			delete[] pMainlist[listNr];
			pMainlist[listNr] = NULL;
		}	
	}
private:
	const unsigned int m_Mainlistsize;
	const unsigned int m_Sublistsize;
	unsigned int m_nSublistCount;
	unsigned int m_nItemCount;
	T *** pMainlist;

	bool CreateSublist()
	{
		if(m_nSublistCount &lt; (m_Mainlistsize -1 ))
		{
			pMainlist[m_nSublistCount++] = new T*[m_Sublistsize];
			memset(pMainlist[m_nSublistCount-1], NULL , m_Sublistsize);;
			return true;
		}
		return false;
	}

	unsigned int GetListNr(unsigned int index) { return index / m_Sublistsize; }
	unsigned int SubListNr(unsigned int index) { return index - ((index / m_Sublistsize) * m_Sublistsize); }

};

void main()
{
	CFastContainer&lt;int&gt; a;

	for(int i = 0; i &lt; 100;  i++)
		a.push_back(i);

	for( i = 0; i &lt; 100;  i++)
		cout &lt;&lt; a[i] &lt;&lt; endl;

	//for( i = 0; i &lt; 50;  i++)
	//{
	//	cout &lt;&lt; i &lt;&lt; &quot; ,,&quot; &lt;&lt; endl;
	//	a.erease(i);
	//}
	a.erease(0);
}
</code></pre>
<p>Kurzfassung:<br />
Beim Rückspsrung aus der Funktion erease stürtzt das Programm ab, mit der Meldung : &quot;BLOCK_TYPE_IS_VALID&quot; .</p>
<p>Irgentwo muss ich mir den Speicher Kaputt machen, aber ich kann nicht erkennen wo das passiert.</p>
<p>Ich bin über jede Hilfe dankbar.</p>
<p>Gruß Stu</p>
<p>PS.: Ich benutze VC++ 6.0.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1104440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1104440</guid><dc:creator><![CDATA[Stu]]></dc:creator><pubDate>Wed, 26 Jul 2006 10:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to Programmabsturz beim Rücksprung on Wed, 26 Jul 2006 11:05:44 GMT]]></title><description><![CDATA[<p>dein problem liegt im destruktor.</p>
<p>fahre ihn mal explizit mit dem debugger durch.<br />
gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1104475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1104475</guid><dc:creator><![CDATA[elise]]></dc:creator><pubDate>Wed, 26 Jul 2006 11:05:44 GMT</pubDate></item><item><title><![CDATA[Reply to Programmabsturz beim Rücksprung on Wed, 26 Jul 2006 11:37:09 GMT]]></title><description><![CDATA[<p>ah vielen dank, hab das problem beheben können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1104510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1104510</guid><dc:creator><![CDATA[Stu]]></dc:creator><pubDate>Wed, 26 Jul 2006 11:37:09 GMT</pubDate></item></channel></rss>