<?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[Stack Overflow, aber warum?]]></title><description><![CDATA[<p>Hallo allerseits, brauch wiedermal hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Bin grad ein bisschen am verzweifeln.<br />
Dieser Code produziert aus irgendeinem Grund einen Stack overflow.<br />
Konnte die letzten 2 Wochen ned an dem Code arbeiten, da ich auf Daten dafür gewartet habe (Zugansdaten für ne xml abfrage, da die alten zugansdaten ned mehr gingen). Jetz hab ich heute eben die neuen Zugansdaten eingegeben, passt auch alles was er an Daten runterläd, jedoch bekomm ich an einer anderen stelle einen Stack overflow. Hier mal der Code:</p>
<pre><code class="language-cpp">struct Saved_Quanty{
	ulong locationID;
	ulong typeID;
	llong min;
	llong max;

	Saved_Quanty(){};
	~Saved_Quanty(){};

	Saved_Quanty(ulong locID, ulong typID, llong mi, llong ma){
		locationID = locID;
		typeID = typID;
		min = mi;
		max = ma;
	};

	bool operator == (Saved_Quanty rhs){
		return(locationID == rhs.locationID &amp;&amp; typeID == rhs.typeID);
	};

	bool operator != (Saved_Quanty rhs){
		return(locationID != rhs.locationID || typeID != rhs.typeID);
	};

	Saved_Quanty(const Saved_Quanty &amp; rhs){
		locationID = rhs.locationID;
		typeID = rhs.typeID;
		min = rhs.min;
		max = rhs.max;
	};

	Saved_Quanty &amp; operator = (Saved_Quanty &amp;rhs){
		if(rhs == *this){  //&lt;--- Hier kommt ein Stack Overflow
			return *this;
		};
		Saved_Quanty to_swap(rhs);
		std::swap(to_swap,*this); //&lt;--- Und hier
		return *this;
	};
};
</code></pre>
<p>bekomme die 3 Fehlermeldungen, die 2te und 3te zu unmengen (über 100x die gleiche), die 1ste nur 1 mal.</p>
<pre><code>&gt;	EVE Logistik -2-.exe!Saved_Quanty::operator=(Saved_Quanty &amp; rhs={...})  Zeile 56 + 0x1b Bytes	C++
 	EVE Logistik -2-.exe!std::swap&lt;Saved_Quanty&gt;(Saved_Quanty &amp; _Left={...}, Saved_Quanty &amp; _Right={...})  Zeile 23	C++
 	EVE Logistik -2-.exe!Saved_Quanty::operator=(Saved_Quanty &amp; rhs={...})  Zeile 61 + 0xd Bytes	C++
</code></pre>
<p>Weis grad echt ned weiter <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="😞"
    /> Der Code funktionierte vor 2 Wochen noch einwandfrei und hab nichts daran geändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244998/stack-overflow-aber-warum</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 23:40:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244998.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 08 Jul 2009 17:41:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Stack Overflow, aber warum? on Wed, 08 Jul 2009 17:41:03 GMT]]></title><description><![CDATA[<p>Hallo allerseits, brauch wiedermal hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Bin grad ein bisschen am verzweifeln.<br />
Dieser Code produziert aus irgendeinem Grund einen Stack overflow.<br />
Konnte die letzten 2 Wochen ned an dem Code arbeiten, da ich auf Daten dafür gewartet habe (Zugansdaten für ne xml abfrage, da die alten zugansdaten ned mehr gingen). Jetz hab ich heute eben die neuen Zugansdaten eingegeben, passt auch alles was er an Daten runterläd, jedoch bekomm ich an einer anderen stelle einen Stack overflow. Hier mal der Code:</p>
<pre><code class="language-cpp">struct Saved_Quanty{
	ulong locationID;
	ulong typeID;
	llong min;
	llong max;

	Saved_Quanty(){};
	~Saved_Quanty(){};

	Saved_Quanty(ulong locID, ulong typID, llong mi, llong ma){
		locationID = locID;
		typeID = typID;
		min = mi;
		max = ma;
	};

	bool operator == (Saved_Quanty rhs){
		return(locationID == rhs.locationID &amp;&amp; typeID == rhs.typeID);
	};

	bool operator != (Saved_Quanty rhs){
		return(locationID != rhs.locationID || typeID != rhs.typeID);
	};

	Saved_Quanty(const Saved_Quanty &amp; rhs){
		locationID = rhs.locationID;
		typeID = rhs.typeID;
		min = rhs.min;
		max = rhs.max;
	};

	Saved_Quanty &amp; operator = (Saved_Quanty &amp;rhs){
		if(rhs == *this){  //&lt;--- Hier kommt ein Stack Overflow
			return *this;
		};
		Saved_Quanty to_swap(rhs);
		std::swap(to_swap,*this); //&lt;--- Und hier
		return *this;
	};
};
</code></pre>
<p>bekomme die 3 Fehlermeldungen, die 2te und 3te zu unmengen (über 100x die gleiche), die 1ste nur 1 mal.</p>
<pre><code>&gt;	EVE Logistik -2-.exe!Saved_Quanty::operator=(Saved_Quanty &amp; rhs={...})  Zeile 56 + 0x1b Bytes	C++
 	EVE Logistik -2-.exe!std::swap&lt;Saved_Quanty&gt;(Saved_Quanty &amp; _Left={...}, Saved_Quanty &amp; _Right={...})  Zeile 23	C++
 	EVE Logistik -2-.exe!Saved_Quanty::operator=(Saved_Quanty &amp; rhs={...})  Zeile 61 + 0xd Bytes	C++
</code></pre>
<p>Weis grad echt ned weiter <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="😞"
    /> Der Code funktionierte vor 2 Wochen noch einwandfrei und hab nichts daran geändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739335</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Wed, 08 Jul 2009 17:41:03 GMT</pubDate></item><item><title><![CDATA[Reply to Stack Overflow, aber warum? on Wed, 08 Jul 2009 17:44:22 GMT]]></title><description><![CDATA[<p>Neo Gandar schrieb:</p>
<blockquote>
<p>Dieser Code produziert aus irgendeinem Grund einen Stack overflow...</p>
</blockquote>
<p>Und vermutlich auch nicht an den genannten Stellen (Stack overflow werden in der Regel an anderen Stellen &quot;vorbereitet&quot; als die eigentliche Fehlermeldung). Ich würde eher die Stellen davor überprüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739339</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 08 Jul 2009 17:44:22 GMT</pubDate></item><item><title><![CDATA[Reply to Stack Overflow, aber warum? on Wed, 08 Jul 2009 17:57:43 GMT]]></title><description><![CDATA[<p>Ahhh, ok, dein Tipp hat mir grad sehr geholfen. Hab jetz eine Codestelle geändert (statt Stack auf den Heap ausgelagert) und es läuft schon mal, muss nur noch prüfen ob die Daten auch noch stimmen.</p>
<p>Hier der alte Code:</p>
<pre><code class="language-cpp">bool Assets::insert_quantities(){
	for(std::list&lt;Item&gt;::iterator iter = mainList.begin(); iter != mainList.end(); ++iter){
		Saved_Quanty temp;
		temp = quanties.get_quant_for_item(iter-&gt;get_locationID(), iter-&gt;get_typeID());
		if(temp != Saved_Quanty(0,0,0,0)){
			iter-&gt;quantities.set_min(temp.min);
			iter-&gt;quantities.set_max(temp.max);
		};
	};

	return true;
};
</code></pre>
<p>Hier der neue:</p>
<pre><code class="language-cpp">bool Assets::insert_quantities(){
	for(std::list&lt;Item&gt;::iterator iter = mainList.begin(); iter != mainList.end(); ++iter){
		Saved_Quanty* temp = new Saved_Quanty(quanties.get_quant_for_item(iter-&gt;get_locationID(), iter-&gt;get_typeID()));
		if(*temp != Saved_Quanty(0,0,0,0)){
			iter-&gt;quantities.set_min(temp-&gt;min);
			iter-&gt;quantities.set_max(temp-&gt;max);
		};
		delete temp;
	};

	return true;
};
</code></pre>
<p>Eine Frage hätte ich aber noch, passt jetzt ned zum Thema.</p>
<p>Habe bei den Projekteinstellungen in Debug den Multi-Byte Zeichensatz, im Release den Unicode-Zeichensatz.</p>
<p>Ich verwende eine Funktionion, die je nach Zeichensatz entweder LPCSTR oder LPCWSTR verwendet. Es ist kein Problem einen std::string in LPCSTR zu casten, jedoch ist es ein problem ihn in LPCWSTR zu casten, auch bei std::wstring.</p>
<p>Kann es jetzt zu problemen kommen wenn ich im Release auch den Multi-Byte Zeichensatz verwende?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739349</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Wed, 08 Jul 2009 17:57:43 GMT</pubDate></item><item><title><![CDATA[Reply to Stack Overflow, aber warum? on Wed, 08 Jul 2009 19:17:54 GMT]]></title><description><![CDATA[<p>Neo Gandar schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Saved_Quanty &amp; operator = (Saved_Quanty &amp;rhs){
		if(rhs == *this){  // normalerweise vergleicht man die Adressen, nicht die Inhalte
			return *this;
		}; // PFUI: &quot;;&quot; ist hier überflüssig
		Saved_Quanty to_swap(rhs);
		std::swap(to_swap,*this); // wieso überhaupt über swap? sind ja bloss 4 integers, die könntest du auch einfach zuweisen...
		return *this;
	}; // PFUI: &quot;;&quot; ist hier überflüssig
</code></pre>
</blockquote>
<p>Rate mal was std::swap verwendet um die Werte zu tauschen. Tip: wenn du richtig rätst, weisst du, woher die Endlos-Rekursion kommt, die deinen Stack-Overflow verursacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739399</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 08 Jul 2009 19:17:54 GMT</pubDate></item><item><title><![CDATA[Reply to Stack Overflow, aber warum? on Thu, 09 Jul 2009 05:14:02 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Neo Gandar schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Saved_Quanty &amp; operator = (Saved_Quanty &amp;rhs){
		if(rhs == *this){  // normalerweise vergleicht man die Adressen, nicht die Inhalte
			return *this;
		}; // PFUI: &quot;;&quot; ist hier überflüssig
		Saved_Quanty to_swap(rhs);
		std::swap(to_swap,*this); // wieso überhaupt über swap? sind ja bloss 4 integers, die könntest du auch einfach zuweisen...
		return *this;
	}; // PFUI: &quot;;&quot; ist hier überflüssig
</code></pre>
</blockquote>
<p>Rate mal was std::swap verwendet um die Werte zu tauschen. Tip: wenn du richtig rätst, weisst du, woher die Endlos-Rekursion kommt, die deinen Stack-Overflow verursacht.</p>
</blockquote>
<p>Erstmal Danke für die Kommentare, werds gleich ändern und versuchen mir es anzugewöhnen es gleich so zu machen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Zum Raten: Jetzt wo dus sagst, stimmt, swap ruft ja immer den = operator auf, aber warum endet es jetzt nicht in einer endlosschleife? Was es doch eigentlich sollte, rein Theoretisch.</p>
<p>Ich werds jetz jedenfalls mal so lassen, dass es in der Funktion dynamisch angelegt wird, muss ja ned alles aufm stack landen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739477</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Thu, 09 Jul 2009 05:14:02 GMT</pubDate></item><item><title><![CDATA[Reply to Stack Overflow, aber warum? on Thu, 09 Jul 2009 06:15:44 GMT]]></title><description><![CDATA[<p>Neo Gandar schrieb:</p>
<blockquote>
<p>Zum Raten: Jetzt wo dus sagst, stimmt, swap ruft ja immer den = operator auf, aber warum endet es jetzt nicht in einer endlosschleife? Was es doch eigentlich sollte, rein Theoretisch.</p>
</blockquote>
<p>Nur, wenn in Deiner Theorie dein Stack unendlich groß ist; denn bei einem Funktionsaufruf werden Parameter und Rücksprungadresse auf dem Stack abgelegt.</p>
<p>Neo Gandar schrieb:</p>
<blockquote>
<p>Ich werds jetz jedenfalls mal so lassen, dass es in der Funktion dynamisch angelegt wird, muss ja ned alles aufm stack landen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Dein Code stinkt. Du brauchst in diesem Fall keinen eigenen Kopier-Konstruktor und auch keinen Zuweisungsoperator, da die Compiler-generierten Versionsn automatisch das Richtige tun. Dein Zuweisungsoperator stinkt außerdem gewaltig. Zum Beispiel nimmt er unnötigerweise den &quot;rhs&quot; Parameter als <em>reference-to-non-const</em>. Deswegen kannst Du auch manche Objekte (&quot;rvalues&quot;) nicht zuweisen. Der Copy-and-Swap-Trick, den Du da nachmachen wolltest, geht ein bischen anders. Aber wie gesagt, der ist in diesem Fall auch überflüssig! Die Vergleichsfunktionen (operator== und operator!=) sollten freie Funktionen mit reference-to-const Parametern sein:</p>
<pre><code class="language-cpp">bool operator==(Saved_Quanty const&amp; lhs, Saved_Quanty const&amp; rhs)  
  {
    return .....
  }
</code></pre>
<p>So, wie Du sie jetzt geschrieben hast, werden die Objekte unnötig kopiert.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739488</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 09 Jul 2009 06:15:44 GMT</pubDate></item></channel></rss>