<?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[Help: std::queue destructor - AccessViolation]]></title><description><![CDATA[<p>Hallo alle, ich bin neu hier, und auch recht neu in C++.</p>
<p>Hier ist die Funktion, die mir probleme macht:</p>
<pre><code>void PushPolyFromStr(char* str) {
	std::queue&lt;char*&gt; pointers;

	unsigned short n=1;
	//loop through all characters. Add pointers of all vertex coordinates into stack
	pointers.push((char*)str);

	while (char(*(++str))!= NULL) {
		if (*str==';') { 
			*str=char(NULL);
			pointers.push(++str); 
			n++;
		};
	}

	TMyPoly* buf = new TMyPoly(n);

	for(; n&gt;0; n--) {
		buf-&gt;Vertices[n-1]=Vertices.AddVertex(VertexFromStr(pointers.front()));
		pointers.pop();
	}

	Polygons.AddPoly(buf);

}
</code></pre>
<p>Meistens funkzioniert es, aber.. Manchmal aber, beim rausgehen der funktion, passiert ein accessviolation fehler.</p>
<p>Hier ist der callstack bei dem Fehler:</p>
<blockquote>
<p>&gt; graph.exe!operator delete(void * pUserData=0xfeeefeee) Line 52 + 0x3 C++<br />
graph.exe!std::allocator&lt;char *&gt;::deallocate(char * * _Ptr=0xfeeefeee, unsigned int __formal=4) Line 132 + 0x9 C++<br />
graph.exe!std::deque&lt;char *,std::allocator&lt;char *&gt; &gt;::_Tidy() Line 957 C++<br />
graph.exe!std::deque&lt;char *,std::allocator&lt;char *&gt; &gt;::clear() Line 800 C++<br />
graph.exe!PushPolyFromStr(char * str=0x0012f5d0) Line 139 C++</p>
</blockquote>
<p>aus irgend-einen grund, versucht also der allocator daten zu löschen, die ohnerhin schon gelöscht sind.<br />
Was genau das Fehler auslöst (warum einiege inputs gehen, aber einiege nicht) konnte ich bisher nicht rausfinden.</p>
<p>Arbeite ich mit der queue falsch? Was passiert da?</p>
<p><strong>Großen Dank im voraus!</strong> Wenn weitere Informationen nötig sind - sagt was, ich kopiere es.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/133047/help-std-queue-destructor-accessviolation</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 18:43:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/133047.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Jan 2006 22:44:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Help: std::queue destructor - AccessViolation on Sat, 14 Jan 2006 22:44:20 GMT]]></title><description><![CDATA[<p>Hallo alle, ich bin neu hier, und auch recht neu in C++.</p>
<p>Hier ist die Funktion, die mir probleme macht:</p>
<pre><code>void PushPolyFromStr(char* str) {
	std::queue&lt;char*&gt; pointers;

	unsigned short n=1;
	//loop through all characters. Add pointers of all vertex coordinates into stack
	pointers.push((char*)str);

	while (char(*(++str))!= NULL) {
		if (*str==';') { 
			*str=char(NULL);
			pointers.push(++str); 
			n++;
		};
	}

	TMyPoly* buf = new TMyPoly(n);

	for(; n&gt;0; n--) {
		buf-&gt;Vertices[n-1]=Vertices.AddVertex(VertexFromStr(pointers.front()));
		pointers.pop();
	}

	Polygons.AddPoly(buf);

}
</code></pre>
<p>Meistens funkzioniert es, aber.. Manchmal aber, beim rausgehen der funktion, passiert ein accessviolation fehler.</p>
<p>Hier ist der callstack bei dem Fehler:</p>
<blockquote>
<p>&gt; graph.exe!operator delete(void * pUserData=0xfeeefeee) Line 52 + 0x3 C++<br />
graph.exe!std::allocator&lt;char *&gt;::deallocate(char * * _Ptr=0xfeeefeee, unsigned int __formal=4) Line 132 + 0x9 C++<br />
graph.exe!std::deque&lt;char *,std::allocator&lt;char *&gt; &gt;::_Tidy() Line 957 C++<br />
graph.exe!std::deque&lt;char *,std::allocator&lt;char *&gt; &gt;::clear() Line 800 C++<br />
graph.exe!PushPolyFromStr(char * str=0x0012f5d0) Line 139 C++</p>
</blockquote>
<p>aus irgend-einen grund, versucht also der allocator daten zu löschen, die ohnerhin schon gelöscht sind.<br />
Was genau das Fehler auslöst (warum einiege inputs gehen, aber einiege nicht) konnte ich bisher nicht rausfinden.</p>
<p>Arbeite ich mit der queue falsch? Was passiert da?</p>
<p><strong>Großen Dank im voraus!</strong> Wenn weitere Informationen nötig sind - sagt was, ich kopiere es.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/966803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/966803</guid><dc:creator><![CDATA[Maverick89]]></dc:creator><pubDate>Sat, 14 Jan 2006 22:44:20 GMT</pubDate></item><item><title><![CDATA[Reply to Help: std::queue destructor - AccessViolation on Sat, 14 Jan 2006 22:47:34 GMT]]></title><description><![CDATA[<p>Ach ja, ich arbeite mit MS Visual C++ 2003</p>
]]></description><link>https://www.c-plusplus.net/forum/post/966805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/966805</guid><dc:creator><![CDATA[Maverick89]]></dc:creator><pubDate>Sat, 14 Jan 2006 22:47:34 GMT</pubDate></item><item><title><![CDATA[Reply to Help: std::queue destructor - AccessViolation on Sun, 15 Jan 2006 12:11:45 GMT]]></title><description><![CDATA[<p>Hallo Maverick,</p>
<p>Die Benutzung der std::queue ist meiner Meinung nach korrekt. Poste doch bitte die Signatur des Konstruktors von TMyPoly - ist sichergestellt, dass Du 'n' dort nicht veränderst?</p>
<p>Abgesehen davon empfehle ich aber die Variable 'n' nicht zur Verwaltung der Anzahl der Elemente zu nutzen. Das kann doch jeder STL-Container allein. Also etwa so:</p>
<pre><code class="language-cpp">void PushPolyFromStr(char* str) {
    std::queue&lt;char*&gt; pointers;

    //loop through all characters. Add pointers of all vertex coordinates into stack
    pointers.push((char*)str);

    while (char(*(++str))!= NULL) {
        if (*str==';') {
            *str=char(NULL);
            pointers.push(++str);
        };
    }

    TMyPoly* buf = new TMyPoly( pointers.size() );

    for( int idx = 0; !pointers.empty(); ++idx ) {
        buf-&gt;Vertices[idx] = Vertices.AddVertex(VertexFromStr(pointers.front()));
        // evt. besser: buf-&gt;Vertices.push_back( .. );
        pointers.pop();
    }

    Polygons.AddPoly(buf);
}
</code></pre>
<p>.. aber das löst wahrscheinlich NICHT Dein Problem;es macht den Code aber gegen versehentliche Fehler robuster.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/966971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/966971</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 15 Jan 2006 12:11:45 GMT</pubDate></item><item><title><![CDATA[Reply to Help: std::queue destructor - AccessViolation on Sun, 15 Jan 2006 12:24:18 GMT]]></title><description><![CDATA[<p>Jo, die Korrektur übernehme ich danke <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>Hier ist der TMyPoly Struct:</p>
<pre><code>struct TMyPoly {
	unsigned short count;   
	unsigned short* Vertices;  //Pointer to an array

	TMyPoly() { TMyPoly::Vertices=NULL; TMyPoly::count=0; }; 
	TMyPoly(unsigned short n) { TMyPoly::count=n; TMyPoly::Vertices = new unsigned short[n]; };
	~TMyPoly() { delete[] TMyPoly::Vertices; }; 

	bool exists(unsigned short v) {
		for (unsigned short i=0; i&lt;count; i++) {
			if (Vertices[i]==v) return true;
		}
		return false;
	}

	inline unsigned short operator[] (unsigned short i) { return TMyPoly::Vertices[i]; };
};
</code></pre>
<p>Hm, ich habe gerade was interessantes entdeckt: ich habe das Compiller auf Multi-Threaded Debug umgeschaltet (das program ist console, Single-Threaded Debug war früher), und das Fehler war wo anderes <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="😮"
    /> Ich bin gerade weiter am debuggen, falls ich eine lösung doch finde - sage ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/966980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/966980</guid><dc:creator><![CDATA[Maverick89]]></dc:creator><pubDate>Sun, 15 Jan 2006 12:24:18 GMT</pubDate></item><item><title><![CDATA[Reply to Help: std::queue destructor - AccessViolation on Sun, 15 Jan 2006 12:57:39 GMT]]></title><description><![CDATA[<p><strong>OK, hat sich erledigt: das Fehler war ein Memory-leak in AddPoly(buf).</strong><br />
Weiß nicht, warum der Single-Thread-Debug so einen Callstack gezeigt hat..</p>
<p><strong>Danke!</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/967009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/967009</guid><dc:creator><![CDATA[Maverick89]]></dc:creator><pubDate>Sun, 15 Jan 2006 12:57:39 GMT</pubDate></item><item><title><![CDATA[Reply to Help: std::queue destructor - AccessViolation on Sun, 15 Jan 2006 13:54:33 GMT]]></title><description><![CDATA[<p>Maverick89 schrieb:</p>
<blockquote>
<p>Hier ist der TMyPoly Struct:</p>
<pre><code>struct TMyPoly {
	unsigned short count;   
	unsigned short* Vertices;  //Pointer to an array

	TMyPoly() { TMyPoly::Vertices=NULL; TMyPoly::count=0; }; 
	TMyPoly(unsigned short n) { TMyPoly::count=n; TMyPoly::Vertices = new unsigned short[n]; };
	~TMyPoly() { delete[] TMyPoly::Vertices; }; 

	bool exists(unsigned short v) {
		for (unsigned short i=0; i&lt;count; i++) {
			if (Vertices[i]==v) return true;
		}
		return false;
	}

	inline unsigned short operator[] (unsigned short i) { return TMyPoly::Vertices[i]; };
};
</code></pre>
</blockquote>
<p>Hallo Maverick,</p>
<p>bei der Klasse TMyPoly fehlt noch der Copy- und der Zuweisungsoperator. Diese sind genau dann notwendig, wenn Du einen nicht trivialen Destruktor hast und das ist mit</p>
<pre><code class="language-cpp">~TMyPoly() { delete[] TMyPoly::Vertices; };
</code></pre>
<p>in Deinem Fall gegeben. Das nennt man 'Rule of three'.<br />
Schreibe z.B. folgenden Code:</p>
<pre><code class="language-cpp">{
    TMyPoly a(8);
    TMyPoly b( a );   // möglich, da Copy-Konstruktor automatisch generiert wird
}  // &lt;- von a UND b wird der Destruktor gerufen -&gt; Crash; da 2mal delete &lt;gleiche Speicheradresse&gt;
</code></pre>
<p>Wenn Du Dir die Mühe nicht machen willst, so setze den Copy- und Zuweisungsoperator private - also:</p>
<pre><code class="language-cpp">struct TMyPoly {
	unsigned short count;  
        // usw. 
private;
    TMyPoly( const TMyPoly&amp; );
    TMyPoly&amp; operator=( const TMyPoly&amp; );
};
</code></pre>
<p>.. dann läßt sich mein Crash-Beispiel nicht übersetzen und der Compiler nennt Dir die kritische Stelle, bevor Du sie mühsam mit dem Debugger suchen musst.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/967048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/967048</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 15 Jan 2006 13:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to Help: std::queue destructor - AccessViolation on Sun, 15 Jan 2006 16:34:41 GMT]]></title><description><![CDATA[<p>Ja, dass habe ich schon korrigiert.<br />
Das problem lag aber auch daran, dass ich dass dynamische array immer per memcpy() kopiert habe, und das copy-constructor deswegen nicht neu aufgerufen wurde, destructor am ende der funktion aber schon.</p>
<p>Danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/967274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/967274</guid><dc:creator><![CDATA[Maverick89]]></dc:creator><pubDate>Sun, 15 Jan 2006 16:34:41 GMT</pubDate></item></channel></rss>