<?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[Corrupted Heap: Hilflos!]]></title><description><![CDATA[<p>Hallo an alle!</p>
<p>Arbeite derzeit an einem größeren Projekt und bin da jetzt auf ein Problem gestoßen, welches ich bis jetzt noch nicht zu lösen vermochte (ich versteh's nicht einmal!). Ich versuch es code-mäßig kurz zu halten, wenn ihr zusätzlichen Code braucht, sagt mir einfach bescheid!<br />
Also. Ich habe zwei Listen (Template-Klasse ogUtilsList) und eine Iterator-Klasse (ogUtilsIterator). Beide Listen enthalten Elemente unterschiedlichen Typs (eine CBuilding* und die Andere CDivision*).<br />
Während des Programmablaufs werden immer wieder Elemente in der Liste hinzugefügt. Wenn das Programm dann beendet wird, durchlaufe ich mit dem Iterator jede der beiden Listen, und rufe für den jeweiligen Datapointer die Exit()-Methode auf, anschließend wird das Element selbst aus der Liste gelöscht. Wenn jetzt nur EINE der beiden Listen Einträge enthält, dann funktioniert alles wunderbar. Soweit so gut. Wenn nun aber BEIDE Listen Einträge enthalten (was eigentlich alles andere als selten vorkommt!), dann unterbricht das Programm bei einem zufällig (mir erscheint es jedenfalls so!) gewählten Eintrag der 2. (es ist IMMER die 2. Liste!!) Liste ab! Um genau zu sein, bricht es an jenem Punkt ab, wo der Container für ein Listenelement gelöscht werden soll. Meldung ist folgende:</p>
<blockquote>
<p>Windows has triggered a breakpoint in Orb to conquer.exe.</p>
<p>This may be due to a corruption of the heap, and indicates a bug in Orb to conquer.exe or any of the DLLs it has loaded.</p>
<p>The output window may have more diagnostic information</p>
</blockquote>
<p>Im &quot;output window&quot; steht oberhalb dieses Textes lediglich:</p>
<blockquote>
<p>HEAP[Orb to conquer.exe]: HEAP: Free Heap block 87bfc40 modified at 87bfc74 after it was freed</p>
</blockquote>
<p>(Leider kann ich diese &quot;Aussage&quot; nicht nachvollziehen!</p>
<p>______________________________________________</p>
<p>Hier jetzt noch der Code der Listen-klasse und des Iterators (Die stelle an welcher das Programm abbricht ist markiert (in der Remove-Methode):</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class ogUtilsIterator;

template &lt;typename T&gt; struct ogUtilsListEntry
{
	ogUtilsListEntry&lt;T&gt;*		pNext;
	T							Data;
};

template &lt;typename T&gt;
class ogUtilsList
{	
private:
	ogUtilsListEntry&lt;T&gt;*		m_pFirst;
	ogUtilsListEntry&lt;T&gt;*		m_pLast;
	UINT						m_iSize;

	ogUtilsList(const ogUtilsList&lt;T&gt;&amp;)								{}
public:
	ogUtilsList() : m_iSize(0), m_pFirst(NULL), m_pLast(NULL)		{}
	~ogUtilsList()													{Clear();}

	ogUtilsListEntry&lt;T&gt;*		Begin()				{return m_pFirst;}
	ogUtilsListEntry&lt;T&gt;*		End()				{return m_pLast;}
	UINT						GetSize()			{return m_iSize;}
	//-------------------------------------------------------------------------//

	bool Insert(T&amp; Data)
	{
		if(m_iSize &lt;= 0) m_pFirst = m_pLast = new ogUtilsListEntry&lt;T&gt;;
		else
		{
			m_pLast-&gt;pNext	= new ogUtilsListEntry&lt;T&gt;;
			m_pLast			= m_pLast-&gt;pNext;
		}
		m_pLast-&gt;pNext = NULL;
		m_pLast-&gt;Data  = Data;
		++m_iSize;
		return true;
	}

	bool Remove(T&amp; Data)
	{
		ogUtilsListEntry&lt;T&gt;* pTemp = m_pFirst;
		ogUtilsListEntry&lt;T&gt;* pLast = NULL;
		for(UINT i = 0; i &lt; m_iSize; ++i)
		{
			if(::memcmp(&amp;(pTemp-&gt;Data), &amp;Data, sizeof(T)) == 0)
			{
				if(pLast) pLast-&gt;pNext = pTemp-&gt;pNext;
				else m_pFirst = pTemp-&gt;pNext;
				if(pTemp == m_pLast) m_pLast = pLast;

				//Delete it!
				OG_SAFE_DELETE(pTemp);
				--m_iSize;
				return true;
			}
			pLast = pTemp;
			pTemp = pTemp-&gt;pNext;
		}
		return false;
	}
	bool Remove(ogUtilsIterator&lt;T&gt;* it)
	{
		ogUtilsListEntry&lt;T&gt;* pTemp = m_pFirst;
		ogUtilsListEntry&lt;T&gt;* pLast = NULL;
		for(UINT i = 0; i &lt; m_iSize; ++i)
		{
			if(it-&gt;m_pCurrent == pTemp)
			{
				if(pLast) pLast-&gt;pNext = pTemp-&gt;pNext;
				else m_pFirst = pTemp-&gt;pNext;
				if(pTemp == m_pLast) m_pLast = pLast;

				it-&gt;m_pNextOne = pTemp-&gt;pNext;
				it-&gt;m_pCurrent = NULL;

				//Delete it!
				OG_SAFE_DELETE(pTemp);           //&lt;&lt;&lt;&lt;&lt;&lt;----- HIER PASSIERTS!!
				--m_iSize;
				return true;
			}
			pLast = pTemp;
			pTemp = pTemp-&gt;pNext;
		}
		return false;
	}

	bool Clear()
	{
		for(UINT i = 0; i &lt; m_iSize; ++i)
		{
			ogUtilsListEntry&lt;T&gt;* pTemp = m_pFirst;
			m_pFirst = m_pFirst-&gt;pNext;
			OG_SAFE_DELETE(pTemp);
		}
		m_iSize		= 0;
		m_pFirst	= NULL;
		m_pLast		= NULL;
		return true;
	}
};

template &lt;typename T&gt;
class ogUtilsIterator
{
public:
	ogUtilsListEntry&lt;T&gt;*		m_pCurrent;
	//Wird verwendet, um während eines Schleifendurchgangs auch etwas aus der Liste löschen zu können
	//Hier wird dann gespeichert, auf welchen Eintrag der Iterator beim nächsten ++ springen soll
	ogUtilsListEntry&lt;T&gt;*		m_pNextOne;

	ogUtilsIterator() : m_pCurrent(NULL), m_pNextOne(NULL)									{}
	ogUtilsIterator(ogUtilsListEntry&lt;T&gt;* pStart) : m_pCurrent(pStart), m_pNextOne(NULL)		{}
	~ogUtilsIterator()																		{}

	bool					EndOfList()					{return m_pCurrent == NULL;}
	bool					NotEndOfList()				{return m_pCurrent != NULL;}
	void					SetData(T NewData)			{if(m_pCurrent) m_pCurrent-&gt;Data = NewData;}

	//Operatoren
	ogUtilsIterator&lt;T&gt;&amp; operator ++ ()								
		{if(m_pCurrent) m_pCurrent = m_pCurrent-&gt;pNext; else {m_pCurrent = m_pNextOne; m_pNextOne = NULL;} return *this;}
	ogUtilsIterator&lt;T&gt;&amp; operator ++ (int)							
		{ogUtilsIterator&lt;T&gt; OldIt = *this; if(m_pCurrent) m_pCurrent = m_pCurrent-&gt;pNext; else {m_pCurrent = m_pNextOne; m_pNextOne = NULL;} return OldIt;}

	ogUtilsIterator&lt;T&gt;&amp; operator () (ogUtilsListEntry&lt;T&gt;* pStart)	{m_pCurrent = pStart; return *this;}
	ogUtilsIterator&lt;T&gt;&amp; operator = (ogUtilsListEntry&lt;T&gt;* pStart)	{m_pCurrent = pStart; return *this;}

	bool operator == (const ogUtilsListEntry&lt;T&gt;* pEntry) {return m_pCurrent == pEntry;}
	bool operator != (const ogUtilsListEntry&lt;T&gt;* pEntry) {return m_pCurrent != pEntry;}

	T* operator -&gt; () {return &amp;(m_pCurrent-&gt;Data);}
	T operator * () {return m_pCurrent-&gt;Data;}
};
</code></pre>
<p>_____________________________________________</p>
<p>Vielleicht wäre es auch noch interessant wie die Listen geleert werden:<br />
(Lasst euch durch das 2-dimensionale Listenarray (pppDivisions) nicht irritieren, es enthält (bis jetzt) nur eine Liste Einträge!)</p>
<pre><code class="language-cpp">//Alle Einheiten löschen
	CGame* pGame = CMain::Instance().GetCurrentGameState&lt;CGame&gt;();
	for(UINT y = 0; y &lt; pGame-&gt;m_iGridHeight; ++y)
	{
		for(UINT x = 0; x &lt; pGame-&gt;m_iGridWidth; ++x)
		{
			for(ogUtilsIterator&lt;CDivision*&gt; i = m_pppDivisions[y][x]-&gt;Begin(); i.NotEndOfList(); ++i)
			{
				//Einheit dieses Sektors löschen
				og2DVector vPos = og2DVector(static_cast&lt;float&gt;(x), static_cast&lt;float&gt;(y));
				ogEMS::Instance().SendOneMessage(this, OTCEM_DIVISIONDESTROYED, &amp;i, &amp;vPos);
			}
			OG_SAFE_DELETE(m_pppDivisions[y][x]);
		}
		OG_SAFE_DELETE_ARRAY(m_pppDivisions[y]);
	}
	OG_SAFE_DELETE_ARRAY(m_pppDivisions);

	//Alle Buildings löschen
	for(ogUtilsIterator&lt;CBuilding*&gt; iterator = m_pBuildings-&gt;Begin(); iterator.NotEndOfList(); ++iterator)
	{
		ogEMS::Instance().SendOneMessage(this, OTCEM_BUILDINGDESTROYED, &amp;iterator);
	}
	OG_SAFE_DELETE(m_pBuildings);
</code></pre>
<p>Und das sind die jeweiligen Methoden, welche aufgerufen werden, sobald eine Instanz die BUILDINGDESTROYED oder DIVISIONDESTROYED Nachricht erhält.</p>
<pre><code class="language-cpp">bool BuildingDestroyed(ogUtilsIterator&lt;CBuilding*&gt;* iterator)
	{
		//Aus EntityManager löschen
		ogEMS::Instance().DeleteObject(**iterator);

		//Instanz selbst löschen
		OG_SAFE_DELETE(iterator-&gt;m_pCurrent-&gt;Data);

		//Aus GebäudeListe entfernen
		m_pBuildings-&gt;Remove(iterator);
		return true;
	}

	bool DivisionDestroyed(ogUtilsIterator&lt;CDivision*&gt;* it, const UINT x, const UINT y)
	{
		//Aus EntityManager löschen
		ogEMS::Instance().DeleteObject(**it);

		//Instanz selbst löschen
		OG_SAFE_DELETE(it-&gt;m_pCurrent-&gt;Data);

		//Aus der &quot;richtigen&quot; Liste löschen
		m_pppDivisions[y][x]-&gt;Remove(it);
		return true;
	}
</code></pre>
<p>(Es passiert hier immer beim Aufruf der Remove()-Methode!)<br />
_____________________________________________</p>
<p>Anmerkung: Es ist egal, welche der beiden Listen als erste geleert wird, es ist IMMER die Zweite bei der der Fehler auftritt!</p>
<p>Hoffe ihr könnt mir helfen... bin am Verzweiflen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183848/corrupted-heap-hilflos</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 12:37:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183848.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Jun 2007 12:59:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Corrupted Heap: Hilflos! on Sat, 09 Jun 2007 12:59:43 GMT]]></title><description><![CDATA[<p>Hallo an alle!</p>
<p>Arbeite derzeit an einem größeren Projekt und bin da jetzt auf ein Problem gestoßen, welches ich bis jetzt noch nicht zu lösen vermochte (ich versteh's nicht einmal!). Ich versuch es code-mäßig kurz zu halten, wenn ihr zusätzlichen Code braucht, sagt mir einfach bescheid!<br />
Also. Ich habe zwei Listen (Template-Klasse ogUtilsList) und eine Iterator-Klasse (ogUtilsIterator). Beide Listen enthalten Elemente unterschiedlichen Typs (eine CBuilding* und die Andere CDivision*).<br />
Während des Programmablaufs werden immer wieder Elemente in der Liste hinzugefügt. Wenn das Programm dann beendet wird, durchlaufe ich mit dem Iterator jede der beiden Listen, und rufe für den jeweiligen Datapointer die Exit()-Methode auf, anschließend wird das Element selbst aus der Liste gelöscht. Wenn jetzt nur EINE der beiden Listen Einträge enthält, dann funktioniert alles wunderbar. Soweit so gut. Wenn nun aber BEIDE Listen Einträge enthalten (was eigentlich alles andere als selten vorkommt!), dann unterbricht das Programm bei einem zufällig (mir erscheint es jedenfalls so!) gewählten Eintrag der 2. (es ist IMMER die 2. Liste!!) Liste ab! Um genau zu sein, bricht es an jenem Punkt ab, wo der Container für ein Listenelement gelöscht werden soll. Meldung ist folgende:</p>
<blockquote>
<p>Windows has triggered a breakpoint in Orb to conquer.exe.</p>
<p>This may be due to a corruption of the heap, and indicates a bug in Orb to conquer.exe or any of the DLLs it has loaded.</p>
<p>The output window may have more diagnostic information</p>
</blockquote>
<p>Im &quot;output window&quot; steht oberhalb dieses Textes lediglich:</p>
<blockquote>
<p>HEAP[Orb to conquer.exe]: HEAP: Free Heap block 87bfc40 modified at 87bfc74 after it was freed</p>
</blockquote>
<p>(Leider kann ich diese &quot;Aussage&quot; nicht nachvollziehen!</p>
<p>______________________________________________</p>
<p>Hier jetzt noch der Code der Listen-klasse und des Iterators (Die stelle an welcher das Programm abbricht ist markiert (in der Remove-Methode):</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class ogUtilsIterator;

template &lt;typename T&gt; struct ogUtilsListEntry
{
	ogUtilsListEntry&lt;T&gt;*		pNext;
	T							Data;
};

template &lt;typename T&gt;
class ogUtilsList
{	
private:
	ogUtilsListEntry&lt;T&gt;*		m_pFirst;
	ogUtilsListEntry&lt;T&gt;*		m_pLast;
	UINT						m_iSize;

	ogUtilsList(const ogUtilsList&lt;T&gt;&amp;)								{}
public:
	ogUtilsList() : m_iSize(0), m_pFirst(NULL), m_pLast(NULL)		{}
	~ogUtilsList()													{Clear();}

	ogUtilsListEntry&lt;T&gt;*		Begin()				{return m_pFirst;}
	ogUtilsListEntry&lt;T&gt;*		End()				{return m_pLast;}
	UINT						GetSize()			{return m_iSize;}
	//-------------------------------------------------------------------------//

	bool Insert(T&amp; Data)
	{
		if(m_iSize &lt;= 0) m_pFirst = m_pLast = new ogUtilsListEntry&lt;T&gt;;
		else
		{
			m_pLast-&gt;pNext	= new ogUtilsListEntry&lt;T&gt;;
			m_pLast			= m_pLast-&gt;pNext;
		}
		m_pLast-&gt;pNext = NULL;
		m_pLast-&gt;Data  = Data;
		++m_iSize;
		return true;
	}

	bool Remove(T&amp; Data)
	{
		ogUtilsListEntry&lt;T&gt;* pTemp = m_pFirst;
		ogUtilsListEntry&lt;T&gt;* pLast = NULL;
		for(UINT i = 0; i &lt; m_iSize; ++i)
		{
			if(::memcmp(&amp;(pTemp-&gt;Data), &amp;Data, sizeof(T)) == 0)
			{
				if(pLast) pLast-&gt;pNext = pTemp-&gt;pNext;
				else m_pFirst = pTemp-&gt;pNext;
				if(pTemp == m_pLast) m_pLast = pLast;

				//Delete it!
				OG_SAFE_DELETE(pTemp);
				--m_iSize;
				return true;
			}
			pLast = pTemp;
			pTemp = pTemp-&gt;pNext;
		}
		return false;
	}
	bool Remove(ogUtilsIterator&lt;T&gt;* it)
	{
		ogUtilsListEntry&lt;T&gt;* pTemp = m_pFirst;
		ogUtilsListEntry&lt;T&gt;* pLast = NULL;
		for(UINT i = 0; i &lt; m_iSize; ++i)
		{
			if(it-&gt;m_pCurrent == pTemp)
			{
				if(pLast) pLast-&gt;pNext = pTemp-&gt;pNext;
				else m_pFirst = pTemp-&gt;pNext;
				if(pTemp == m_pLast) m_pLast = pLast;

				it-&gt;m_pNextOne = pTemp-&gt;pNext;
				it-&gt;m_pCurrent = NULL;

				//Delete it!
				OG_SAFE_DELETE(pTemp);           //&lt;&lt;&lt;&lt;&lt;&lt;----- HIER PASSIERTS!!
				--m_iSize;
				return true;
			}
			pLast = pTemp;
			pTemp = pTemp-&gt;pNext;
		}
		return false;
	}

	bool Clear()
	{
		for(UINT i = 0; i &lt; m_iSize; ++i)
		{
			ogUtilsListEntry&lt;T&gt;* pTemp = m_pFirst;
			m_pFirst = m_pFirst-&gt;pNext;
			OG_SAFE_DELETE(pTemp);
		}
		m_iSize		= 0;
		m_pFirst	= NULL;
		m_pLast		= NULL;
		return true;
	}
};

template &lt;typename T&gt;
class ogUtilsIterator
{
public:
	ogUtilsListEntry&lt;T&gt;*		m_pCurrent;
	//Wird verwendet, um während eines Schleifendurchgangs auch etwas aus der Liste löschen zu können
	//Hier wird dann gespeichert, auf welchen Eintrag der Iterator beim nächsten ++ springen soll
	ogUtilsListEntry&lt;T&gt;*		m_pNextOne;

	ogUtilsIterator() : m_pCurrent(NULL), m_pNextOne(NULL)									{}
	ogUtilsIterator(ogUtilsListEntry&lt;T&gt;* pStart) : m_pCurrent(pStart), m_pNextOne(NULL)		{}
	~ogUtilsIterator()																		{}

	bool					EndOfList()					{return m_pCurrent == NULL;}
	bool					NotEndOfList()				{return m_pCurrent != NULL;}
	void					SetData(T NewData)			{if(m_pCurrent) m_pCurrent-&gt;Data = NewData;}

	//Operatoren
	ogUtilsIterator&lt;T&gt;&amp; operator ++ ()								
		{if(m_pCurrent) m_pCurrent = m_pCurrent-&gt;pNext; else {m_pCurrent = m_pNextOne; m_pNextOne = NULL;} return *this;}
	ogUtilsIterator&lt;T&gt;&amp; operator ++ (int)							
		{ogUtilsIterator&lt;T&gt; OldIt = *this; if(m_pCurrent) m_pCurrent = m_pCurrent-&gt;pNext; else {m_pCurrent = m_pNextOne; m_pNextOne = NULL;} return OldIt;}

	ogUtilsIterator&lt;T&gt;&amp; operator () (ogUtilsListEntry&lt;T&gt;* pStart)	{m_pCurrent = pStart; return *this;}
	ogUtilsIterator&lt;T&gt;&amp; operator = (ogUtilsListEntry&lt;T&gt;* pStart)	{m_pCurrent = pStart; return *this;}

	bool operator == (const ogUtilsListEntry&lt;T&gt;* pEntry) {return m_pCurrent == pEntry;}
	bool operator != (const ogUtilsListEntry&lt;T&gt;* pEntry) {return m_pCurrent != pEntry;}

	T* operator -&gt; () {return &amp;(m_pCurrent-&gt;Data);}
	T operator * () {return m_pCurrent-&gt;Data;}
};
</code></pre>
<p>_____________________________________________</p>
<p>Vielleicht wäre es auch noch interessant wie die Listen geleert werden:<br />
(Lasst euch durch das 2-dimensionale Listenarray (pppDivisions) nicht irritieren, es enthält (bis jetzt) nur eine Liste Einträge!)</p>
<pre><code class="language-cpp">//Alle Einheiten löschen
	CGame* pGame = CMain::Instance().GetCurrentGameState&lt;CGame&gt;();
	for(UINT y = 0; y &lt; pGame-&gt;m_iGridHeight; ++y)
	{
		for(UINT x = 0; x &lt; pGame-&gt;m_iGridWidth; ++x)
		{
			for(ogUtilsIterator&lt;CDivision*&gt; i = m_pppDivisions[y][x]-&gt;Begin(); i.NotEndOfList(); ++i)
			{
				//Einheit dieses Sektors löschen
				og2DVector vPos = og2DVector(static_cast&lt;float&gt;(x), static_cast&lt;float&gt;(y));
				ogEMS::Instance().SendOneMessage(this, OTCEM_DIVISIONDESTROYED, &amp;i, &amp;vPos);
			}
			OG_SAFE_DELETE(m_pppDivisions[y][x]);
		}
		OG_SAFE_DELETE_ARRAY(m_pppDivisions[y]);
	}
	OG_SAFE_DELETE_ARRAY(m_pppDivisions);

	//Alle Buildings löschen
	for(ogUtilsIterator&lt;CBuilding*&gt; iterator = m_pBuildings-&gt;Begin(); iterator.NotEndOfList(); ++iterator)
	{
		ogEMS::Instance().SendOneMessage(this, OTCEM_BUILDINGDESTROYED, &amp;iterator);
	}
	OG_SAFE_DELETE(m_pBuildings);
</code></pre>
<p>Und das sind die jeweiligen Methoden, welche aufgerufen werden, sobald eine Instanz die BUILDINGDESTROYED oder DIVISIONDESTROYED Nachricht erhält.</p>
<pre><code class="language-cpp">bool BuildingDestroyed(ogUtilsIterator&lt;CBuilding*&gt;* iterator)
	{
		//Aus EntityManager löschen
		ogEMS::Instance().DeleteObject(**iterator);

		//Instanz selbst löschen
		OG_SAFE_DELETE(iterator-&gt;m_pCurrent-&gt;Data);

		//Aus GebäudeListe entfernen
		m_pBuildings-&gt;Remove(iterator);
		return true;
	}

	bool DivisionDestroyed(ogUtilsIterator&lt;CDivision*&gt;* it, const UINT x, const UINT y)
	{
		//Aus EntityManager löschen
		ogEMS::Instance().DeleteObject(**it);

		//Instanz selbst löschen
		OG_SAFE_DELETE(it-&gt;m_pCurrent-&gt;Data);

		//Aus der &quot;richtigen&quot; Liste löschen
		m_pppDivisions[y][x]-&gt;Remove(it);
		return true;
	}
</code></pre>
<p>(Es passiert hier immer beim Aufruf der Remove()-Methode!)<br />
_____________________________________________</p>
<p>Anmerkung: Es ist egal, welche der beiden Listen als erste geleert wird, es ist IMMER die Zweite bei der der Fehler auftritt!</p>
<p>Hoffe ihr könnt mir helfen... bin am Verzweiflen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301974</guid><dc:creator><![CDATA[BlackPanther]]></dc:creator><pubDate>Sat, 09 Jun 2007 12:59:43 GMT</pubDate></item><item><title><![CDATA[Reply to Corrupted Heap: Hilflos! on Sat, 09 Jun 2007 13:16:09 GMT]]></title><description><![CDATA[<p>Was spricht egtl gegen std::list&lt;&gt;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301982</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 09 Jun 2007 13:16:09 GMT</pubDate></item><item><title><![CDATA[Reply to Corrupted Heap: Hilflos! on Sat, 09 Jun 2007 13:37:13 GMT]]></title><description><![CDATA[<p>Im Grunde nichts, nur möchte ich 1. verstehen wo da das Problem liegt, und 2. wollte ich eigentlich die STL nicht verwenden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301993</guid><dc:creator><![CDATA[BlackPanther]]></dc:creator><pubDate>Sat, 09 Jun 2007 13:37:13 GMT</pubDate></item><item><title><![CDATA[Reply to Corrupted Heap: Hilflos! on Sat, 09 Jun 2007 13:40:08 GMT]]></title><description><![CDATA[<p>BlackPanther schrieb:</p>
<blockquote>
<p>Im Grunde nichts, nur möchte ich 1. verstehen wo da das Problem liegt, und 2. wollte ich eigentlich die STL nicht verwenden...</p>
</blockquote>
<p>Der erste Grund ist hoch lobenswert. Den zweiten versteh ich nicht. Wieso willst du nicht die STL verwenden? Nichtbenutzen der STL bringt meist viel mehr Code als das verwenden genannter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301997</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 09 Jun 2007 13:40:08 GMT</pubDate></item><item><title><![CDATA[Reply to Corrupted Heap: Hilflos! on Sat, 09 Jun 2007 14:02:07 GMT]]></title><description><![CDATA[<p>In diesem Projekt gibt es bis jetzt NICHTS was NICHT von MIR ist... Nenn es Ehrgeiz, aber wenn ich schon mal diese Listen-Klasse ausprogrammiert habe, und sie bis jetzt eigentlich auch immer einwandfrei funktionierte, warum sollte ich da dann die STL verwenden. Im prinzip für ein Stück code, das ich sowieso schon habe?<br />
Ich hoffe du verstehst mich diesbezüglich... Bin halt im Moment auf dem Alles-Selber-Machen-Wollen-Trip <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302007</guid><dc:creator><![CDATA[BlackPanther]]></dc:creator><pubDate>Sat, 09 Jun 2007 14:02:07 GMT</pubDate></item><item><title><![CDATA[Reply to Corrupted Heap: Hilflos! on Sat, 09 Jun 2007 14:06:45 GMT]]></title><description><![CDATA[<p>Dann machs doch bitte richtig. Die Liste hat einige viele Mängel! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302008</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 09 Jun 2007 14:06:45 GMT</pubDate></item><item><title><![CDATA[Reply to Corrupted Heap: Hilflos! on Sat, 09 Jun 2007 14:20:04 GMT]]></title><description><![CDATA[<p>Was fehlt denn da? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302015</guid><dc:creator><![CDATA[BlackPanther]]></dc:creator><pubDate>Sat, 09 Jun 2007 14:20:04 GMT</pubDate></item><item><title><![CDATA[Reply to Corrupted Heap: Hilflos! on Sat, 09 Jun 2007 17:38:59 GMT]]></title><description><![CDATA[<p>Das fängt schon bei den Parametern an:</p>
<pre><code class="language-cpp">bool Insert(T&amp; Data)
</code></pre>
<p>Das macht sowas unmöglich:</p>
<pre><code class="language-cpp">ogUtilsList&lt; int &gt; list;
list.Insert( 10 );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1302145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302145</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 09 Jun 2007 17:38:59 GMT</pubDate></item><item><title><![CDATA[Reply to Corrupted Heap: Hilflos! on Sun, 10 Jun 2007 00:34:20 GMT]]></title><description><![CDATA[<p>Dein &quot;operator ++ (int)&quot; ist falsch. Du darfst nie Referenzen auf lokale Variablen zurückgeben -- in so einem Fall gibt man eine Kopie zurück.</p>
<p>Dass SetData sein Parameter per-value übernimmt ist auch zumindest suboptimal, und &quot;const&quot; scheint für dich auch ein unbekanntes Keyword zu sein -- zumindest fehlt es an vielen vielen Stellen wo man es (zu Recht) anzutreffen erwarten würde.</p>
<p>Davon abgesehen wäre der Code mit STL + Boost (speziell shared_ptr oder pointer container) wohl etwa 1/4 - 1/2 so lange, und hätte wahrscheinlich auch weniger Fehler. Ganz davon abgesehen dass er wahrscheinlich übersichtlicher und u.U. auch etwas &quot;normaler&quot; und nicht so abgedreht wie das was du gepostet hast. Und ziemlich sicher auch wesentlich performanter. BTW: Wenn ich raten müsste würde ich tippen dass dort wo du jetzt Listen verwendest eher Vektoren die bessere Wahl wären.</p>
<p>Nochwas: Instanzen mit memcmp vergleichen ist nicht wirklich generisch, normalerweise verwendet man da einfach den operator ==, oder alternativ den operator &lt; (mit &quot;!(a &lt; b || b &lt; a)&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302266</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 10 Jun 2007 00:34:20 GMT</pubDate></item><item><title><![CDATA[Reply to Corrupted Heap: Hilflos! on Sun, 10 Jun 2007 01:12:00 GMT]]></title><description><![CDATA[<p>Bei solchen Fehler hilft DUMA weiter. Für Linux gäbe es auch noch valgrind, als umfangreichere Alternative.</p>
<p>Ansonsten würde ich dir, wenn du schon alles selbst schreiben willst (ich hoffe du überlädst auch die new/delete-Operatoren selbst und schreibst den Code fürs Stack-Unrolling/RTTI :p), dann setz dich wenigstens mal mit der STL auseinander, weil die Lösungen die dort benutzt werden, sind gar nicht mal so schlecht...</p>
<p>Die Dokumentation von SGI ist nicht schlecht, da man dort auch die Hintergründe und Konzepte versteht <a href="http://www.sgi.com/tech/stl/table_of_contents.html" rel="nofollow">http://www.sgi.com/tech/stl/table_of_contents.html</a></p>
<p>ein Blick ich GotW sollte auch nicht schaden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302272</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sun, 10 Jun 2007 01:12:00 GMT</pubDate></item></channel></rss>