<?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[pointer auf pointer multithreaded]]></title><description><![CDATA[<p>Hi<br />
Ich hab ein sehr schräges problem und muss mir überlegen ob ich das design des programmes nicht umstellen muß.</p>
<p>ich hab eine multithreaded application ( server client ) wo ich klassen in einem vector speicher ( die client threads im prinzip ).</p>
<p>dafür hab ich natürlich eine liste aller thread klassen.<br />
jetzt würde ich gerne den klassen private listen mit der referenz einiger klassen mitgeben.</p>
<p>sollte an einem der threads eine exeption bei der tcp connection passieren, dann will ich die klasse entfernen die die exception ausgelöst hat.</p>
<p>da ich jetzt mehrere listen hab ( private und die hauptliste ) hab ich mir gedacht ich mach einfach einen pointer auf einen pointer auf eine klasse.</p>
<p>damit könnte ich das objekt zerstören und den zwischenpointer auf NULL setzen.<br />
damit kann ich bei jedem zugriff auf die liste von pointer auf pointer immer abfragen ob das objekt noch existiert und wenn der zwischenpointer NULL ist einfach das aus dem vector entfernen ( die listen halten sich selbst sauber ).</p>
<p>tatsächlich funktioniert das aber überhaupt nicht.</p>
<p>ich geb mal ein simples code beispiel:</p>
<pre><code>vector&lt;klasse**&gt; cl1;
	vector&lt;klasse**&gt; cl2;
	unsigned int i;
for (i = 0; i &lt; 5; i++){
// neue klasse instanzieren und den pointer darauf in c speichern
	klasse *c = new klasse();
// objekt mit daten füllen
	c-&gt;h = i;
	c-&gt;w = i;
	c-&gt;x = i;
	c-&gt;x = i;
	klasse **d = &amp;c;
	cout &lt;&lt; (*d)-&gt;w &lt;&lt; endl;
// pointer auf pointer in vector speichern
	cl1.push_back(d);
	cl2.push_back(d);
}
// ausgabe mit prüfung ob zwischenpointer null ist
for (i = 0; i &lt; cl1.size(); i++){
	if ( *cl1.at(i) == NULL) { cout &lt;&lt; &quot;obj ist NULL&quot; &lt;&lt; endl; } else { cout &lt;&lt; &quot;erg:&quot; &lt;&lt; (*cl1.at(i))-&gt;w &lt;&lt; endl;}
}
</code></pre>
<p>allerdings scheint eu so zu sein, als würde ich nur den c* verbiegen.<br />
letzten endes hab ich in der liste immer nur &quot;4&quot; stehen und alle zwischenpointer zeigen auf das gleiche objekt.<br />
wobei ich natürlich die referenzen auf alle anderen objekte verliere.<br />
-&gt; sehr schlecht <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>leider helfen mir auch die boost smart pointer nicht, weil die das umgekehrte problem angehen - die löschen das objekt wenn keine referenz mehr vorhanden ist.<br />
ich möchte aber im prinzip das objekt löschen wären noch referenzen existieren und das abfragen.....</p>
<p>hoffe das war verständlich und sicher zu lange zum lesen <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>lg<br />
Verucca</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184817/pointer-auf-pointer-multithreaded</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 23:56:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184817.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Jun 2007 12:47:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to pointer auf pointer multithreaded on Tue, 19 Jun 2007 12:47:02 GMT]]></title><description><![CDATA[<p>Hi<br />
Ich hab ein sehr schräges problem und muss mir überlegen ob ich das design des programmes nicht umstellen muß.</p>
<p>ich hab eine multithreaded application ( server client ) wo ich klassen in einem vector speicher ( die client threads im prinzip ).</p>
<p>dafür hab ich natürlich eine liste aller thread klassen.<br />
jetzt würde ich gerne den klassen private listen mit der referenz einiger klassen mitgeben.</p>
<p>sollte an einem der threads eine exeption bei der tcp connection passieren, dann will ich die klasse entfernen die die exception ausgelöst hat.</p>
<p>da ich jetzt mehrere listen hab ( private und die hauptliste ) hab ich mir gedacht ich mach einfach einen pointer auf einen pointer auf eine klasse.</p>
<p>damit könnte ich das objekt zerstören und den zwischenpointer auf NULL setzen.<br />
damit kann ich bei jedem zugriff auf die liste von pointer auf pointer immer abfragen ob das objekt noch existiert und wenn der zwischenpointer NULL ist einfach das aus dem vector entfernen ( die listen halten sich selbst sauber ).</p>
<p>tatsächlich funktioniert das aber überhaupt nicht.</p>
<p>ich geb mal ein simples code beispiel:</p>
<pre><code>vector&lt;klasse**&gt; cl1;
	vector&lt;klasse**&gt; cl2;
	unsigned int i;
for (i = 0; i &lt; 5; i++){
// neue klasse instanzieren und den pointer darauf in c speichern
	klasse *c = new klasse();
// objekt mit daten füllen
	c-&gt;h = i;
	c-&gt;w = i;
	c-&gt;x = i;
	c-&gt;x = i;
	klasse **d = &amp;c;
	cout &lt;&lt; (*d)-&gt;w &lt;&lt; endl;
// pointer auf pointer in vector speichern
	cl1.push_back(d);
	cl2.push_back(d);
}
// ausgabe mit prüfung ob zwischenpointer null ist
for (i = 0; i &lt; cl1.size(); i++){
	if ( *cl1.at(i) == NULL) { cout &lt;&lt; &quot;obj ist NULL&quot; &lt;&lt; endl; } else { cout &lt;&lt; &quot;erg:&quot; &lt;&lt; (*cl1.at(i))-&gt;w &lt;&lt; endl;}
}
</code></pre>
<p>allerdings scheint eu so zu sein, als würde ich nur den c* verbiegen.<br />
letzten endes hab ich in der liste immer nur &quot;4&quot; stehen und alle zwischenpointer zeigen auf das gleiche objekt.<br />
wobei ich natürlich die referenzen auf alle anderen objekte verliere.<br />
-&gt; sehr schlecht <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>leider helfen mir auch die boost smart pointer nicht, weil die das umgekehrte problem angehen - die löschen das objekt wenn keine referenz mehr vorhanden ist.<br />
ich möchte aber im prinzip das objekt löschen wären noch referenzen existieren und das abfragen.....</p>
<p>hoffe das war verständlich und sicher zu lange zum lesen <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>lg<br />
Verucca</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309121</guid><dc:creator><![CDATA[Verucca]]></dc:creator><pubDate>Tue, 19 Jun 2007 12:47:02 GMT</pubDate></item><item><title><![CDATA[Reply to pointer auf pointer multithreaded on Tue, 19 Jun 2007 19:19:27 GMT]]></title><description><![CDATA[<p>Hallo Verucca,</p>
<p>ich hab zwar noch nicht alles verstande, was du vo hast,<br />
allerdings ist mir nen (vermeintlicher) grundlegender Fehler aufgefallen.<br />
Die Vectoren liegen auf dem Stack:</p>
<pre><code class="language-cpp">vector&lt;klasse**&gt; cl1;
    vector&lt;klasse**&gt; cl2;
</code></pre>
<p>Beim Starten eines neuen Threads läuft der ursprüngliche weiter und<br />
überschreibt deinen Stack. (Es sei denn du blockierst den Aktuellen -&gt; nicht elegant)</p>
<p>Und an dieser Stelle machst du z.B. nen Verweis auf ne Stack-Adresse.</p>
<pre><code class="language-cpp">klasse **d = &amp;c;
</code></pre>
<p>und dadurch, dass der Block &quot;}&quot; geschlossen wird, gibst du alles frei, was in<br />
diesem Scope {...alles dazwischen...} auf den Stack gelegt wurde, folglich auch diesen Zeiger</p>
<pre><code class="language-cpp">klasse *c
</code></pre>
<p>DEFINITIVE FEHLERQUELLE</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309374</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 19 Jun 2007 19:19:27 GMT</pubDate></item><item><title><![CDATA[Reply to pointer auf pointer multithreaded on Tue, 19 Jun 2007 20:19:21 GMT]]></title><description><![CDATA[<p>btw:</p>
<p>Du hast Glück, dass dein Programm nicht ganz auf die Nase fliegt wegen<br />
des Problems, was ich gesagt habe, aber der Stack ist scheinbar noch nicht so<br />
weit überschrieben (segmentation fault)<br />
Warum du nur 4 Objekte drin hast, sehe ich jetzt auf Anhieb nicht,<br />
allerdings besitzt</p>
<pre><code class="language-cpp">klasse *c
</code></pre>
<p>innerhalb der for-Schleife immer die selbe Adresse (aufm Stack) und folglich<br />
hast du auch immer nen Zeiger auf die gleiche Adresse.</p>
<p>Gruß,<br />
CSpille</p>
<p>EDIT:<br />
Ah...<br />
Du hast den Wert 4 drin und nicht 4 Objekte...<br />
Das sollte sich aber dadurch erklärt haben.<br />
btw: Dein Problem hat nix mit Multithreading zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309388</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 19 Jun 2007 20:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to pointer auf pointer multithreaded on Tue, 19 Jun 2007 19:34:04 GMT]]></title><description><![CDATA[<p>Ich hoffe das hilft dir schonmal weiter...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309390</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 19 Jun 2007 19:34:04 GMT</pubDate></item></channel></rss>