<?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[Kann man so ein Objekt kopieren]]></title><description><![CDATA[<p>Ich habe folgenden Code geschrieben</p>
<pre><code class="language-cpp">typedef boost::unordered_map&lt;uint32_t, ddos_request, boost::hash&lt;uint32_t&gt; &gt; map;
map connections;

boost::mutex mutex;
//...
</code></pre>
<p>D.h. die Map connection enthält also keine Pointer sondern Referenzen. Da mein Programm mehrere Threads verwendet muss diese Liste nun für Thread 2 kopiert werden, damit Thread 1 weiterarbeiten kann.</p>
<pre><code class="language-cpp">/* Kopiere die Connections map */
		mutex.lock();
		map connections_cp = connections;
		mutex.unlock();

		// Lösche die Connnections map 
		connections.clear();
</code></pre>
<p>Ich frage mich jetzt ob connection_cp ein Kopie von connections ist (samt Inhalt) und damit völlig unabhängig von Veränderungen in connections ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270995/kann-man-so-ein-objekt-kopieren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 18:02:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270995.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Jul 2010 15:40:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kann man so ein Objekt kopieren on Wed, 21 Jul 2010 15:40:08 GMT]]></title><description><![CDATA[<p>Ich habe folgenden Code geschrieben</p>
<pre><code class="language-cpp">typedef boost::unordered_map&lt;uint32_t, ddos_request, boost::hash&lt;uint32_t&gt; &gt; map;
map connections;

boost::mutex mutex;
//...
</code></pre>
<p>D.h. die Map connection enthält also keine Pointer sondern Referenzen. Da mein Programm mehrere Threads verwendet muss diese Liste nun für Thread 2 kopiert werden, damit Thread 1 weiterarbeiten kann.</p>
<pre><code class="language-cpp">/* Kopiere die Connections map */
		mutex.lock();
		map connections_cp = connections;
		mutex.unlock();

		// Lösche die Connnections map 
		connections.clear();
</code></pre>
<p>Ich frage mich jetzt ob connection_cp ein Kopie von connections ist (samt Inhalt) und damit völlig unabhängig von Veränderungen in connections ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929675</guid><dc:creator><![CDATA[HändyÄndy]]></dc:creator><pubDate>Wed, 21 Jul 2010 15:40:08 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man so ein Objekt kopieren on Wed, 21 Jul 2010 15:55:37 GMT]]></title><description><![CDATA[<p>Unter der Annahme, dass in dem Container Referenzen gespeichert sind und es sich um eine Multithread-Anwendung handelt, musst du den Zugriff bei jedem Zugriff auf eines der Elemente synchronisieren. Das ist auch dann noch notwendig, wenn du den Inhalt kopierst. Schließlich handelt es sich dann noch immer um Referenzen, die auch den anderen Threads zugänglich wären.</p>
<p>Eine Referenz ist letztendlich nur eine schönere Form eines Pointers.</p>
<p>In deinem Code löscht du zudem alle Einträge des Containers ohne diesen Zugriff zu synchroniseren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929690</guid><dc:creator><![CDATA[----]]></dc:creator><pubDate>Wed, 21 Jul 2010 15:55:37 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man so ein Objekt kopieren on Wed, 21 Jul 2010 16:18:37 GMT]]></title><description><![CDATA[<p>Naja, Thread 2 arbeitet ja nur mit connections_cp und nicht mit connections. Nur Thread 1 benutzt connections, nicht Thread 2. Und der Kopiervorgang ist geschützt.</p>
<p>Ich versuche meine Frage nochmal anders zu formulieren. Ich habe in connections Objekte gespeichert und keine Pointer. Z.B. so</p>
<p>Object obj; //erstelle ein Object<br />
connections[21] = obj;</p>
<p>Jetzt wird obj an eine Stelle in der Map kopiert, d.h. es gibt zwei unabhängige Objekt nämlich obj und connections[21]. Verändere ich nun obj irgendwie, dann ist connections[21] davon nicht betroffen.</p>
<p>Wenn ich aber jetzt die Map kopiere,</p>
<p>map connections_cp = connections;</p>
<p>dann, dann sind die Objekte an connections_cp[21] und connections[21] doch vollkommen unabhängig von einander, d.h. Veränderungen an connections[21] wirken sich in keinster Weise auf connections_cp[21] aus.</p>
<p>Das stimmt doch, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929714</guid><dc:creator><![CDATA[HändyÄndy]]></dc:creator><pubDate>Wed, 21 Jul 2010 16:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man so ein Objekt kopieren on Wed, 21 Jul 2010 18:19:59 GMT]]></title><description><![CDATA[<p>Kommst du zufällig aus der Java-Ecke? Du würfelst die Begriffe Referenz und Objekt nämlich ein wenig durcheinander.</p>
<p>Hier zum Beispiel:</p>
<pre><code class="language-cpp">typedef boost::unordered_map&lt;uint32_t, ddos_request&gt; map;
</code></pre>
<p>erstellt durchaus (solange ddos_request kein typedef für eine Referenz ist) eine Map mit Objekten dieses Typs, und nicht mit Referenzen auf ddos_requests.</p>
<p>Und das:</p>
<p>HändyÄndy schrieb:</p>
<blockquote>
<p>Jetzt wird obj an eine Stelle in der Map kopiert, d.h. es gibt zwei unabhängige Objekt nämlich obj und connections[21]. Verändere ich nun obj irgendwie, dann ist connections[21] davon nicht betroffen.</p>
</blockquote>
<p>ist so auch nicht koscher, wenn du in connections wirklich Referenzen speicherst.</p>
<p>Wenn es dir um wirkliche Referenzen geht: Wenn du eine Map aus Referenzen auf Objekte kopierst, werden sich in der neuen Map nur Kopien der Referenzen befinden. Diese Referenzen referenzieren dann immer noch die ursprünglichen Objekte (wo auch immer du diese erstellst).</p>
<p>Ansonsten wäre es gut zu wissen, was genau du jetzt in deiner Map speichern willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929757</guid><dc:creator><![CDATA[Famer]]></dc:creator><pubDate>Wed, 21 Jul 2010 18:19:59 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man so ein Objekt kopieren on Wed, 21 Jul 2010 19:13:43 GMT]]></title><description><![CDATA[<p>Ja, ich komme tatsächlich aus der Java Ecke.</p>
<p>ddos_request ist eine Klasse, daher bekomme ich durch</p>
<p>ddos_request r;</p>
<p>ja eine Instanz oder ein Objekt diesen Typs, also keine Referenz. Dieses Objekt speicher ich dann in der map zB mittels</p>
<p>connections[21] = r;</p>
<p>D.h. ja, dass connections[21] dann eine Kopie des Objekts r ist bzw. ich denke doch mal das connections[21] dann wenigstens eine Referenz auf eine Kopie des Objekts r ist?</p>
<p>Wenn ich nun die map connections kopieren möchte, d.h. die Objekte aus connections mitkopieren möchte, dann kann ich das doch hoffentlich so machen:</p>
<p>map connections_cp = connections;</p>
<p>Oder gehe ich falsch inder Annahme?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929778</guid><dc:creator><![CDATA[HändyÄndy]]></dc:creator><pubDate>Wed, 21 Jul 2010 19:13:43 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man so ein Objekt kopieren on Wed, 21 Jul 2010 19:58:37 GMT]]></title><description><![CDATA[<p>Es tatsächlich so wie ich es vermutet habe. Hier ein Beispielprogramm</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;boost/unordered_map.hpp&gt;

using std::cout;
using std::endl;
using std::string;

class packet {
	public:
	std::string name;
	int num;
	packet();
	//packet( const packet&amp; );
	packet( std::string name, int num );
};

packet::packet() {
	cout &lt;&lt; &quot;Leerer Konstruktor&quot; &lt;&lt; endl;
};

/*
packet::packet( const packet&amp; p ) {
	cout &lt;&lt; &quot;Copy Konstruktor für &quot; &lt;&lt; p.name &lt;&lt; endl;
	num = p.num;
	name = p.name;
};*/

packet::packet( std::string name_, int num_ ) {
	cout &lt;&lt; &quot;Standard Konstruktor&quot; &lt;&lt; endl;
	name = name_;
	num = num_;
}

typedef boost::unordered_map&lt;int, packet, boost::hash&lt;int&gt; &gt; map;
map connections;
map connections_cp;

int main( int argc, const char* argv[] ) {	
	connections[1] = packet( &quot;Eins&quot;, 1);
	connections[2] = packet( &quot;Zwei&quot;, 2);

	cout &lt;&lt; &quot;connections[1].name = &quot; &lt;&lt; connections[1].name &lt;&lt; &quot; connections[1].num = &quot; &lt;&lt; connections[1].num &lt;&lt; endl;
	cout &lt;&lt; &quot;connections[2].name = &quot; &lt;&lt; connections[2].name &lt;&lt; &quot; connections[2].num = &quot; &lt;&lt; connections[2].num &lt;&lt; endl;

	cout &lt;&lt; &quot;Vor  dem Kopiervorgang&quot; &lt;&lt; endl;
	connections_cp = connections;
	cout &lt;&lt; &quot;Nach dem Kopiervorgang&quot; &lt;&lt; endl;
	connections.clear();

	cout &lt;&lt; &quot;connections[1].name = &quot; &lt;&lt; connections[1].name &lt;&lt; &quot; connections[1].num = &quot; &lt;&lt; connections[1].num &lt;&lt; endl;
	cout &lt;&lt; &quot;connections[2].name = &quot; &lt;&lt; connections[2].name &lt;&lt; &quot; connections[2].num = &quot; &lt;&lt; connections[2].num &lt;&lt; endl;

	cout &lt;&lt; &quot;connections_cp[1].name = &quot; &lt;&lt; connections_cp[1].name &lt;&lt; &quot; connections_cp[1].num = &quot; &lt;&lt; connections_cp[1].num &lt;&lt; endl;
	cout &lt;&lt; &quot;connections_cp[2].name = &quot; &lt;&lt; connections_cp[2].name &lt;&lt; &quot; connections_cp[2].num = &quot; &lt;&lt; connections_cp[2].num &lt;&lt; endl;

}
</code></pre>
<p>Ausgabe auf der Konsole:</p>
<blockquote>
<p>[anthovak@findthee test]$ ./runme<br />
Standard Konstruktor<br />
Leerer Konstruktor<br />
Standard Konstruktor<br />
Leerer Konstruktor<br />
connections[1].name = Eins connections[1].num = 1<br />
connections[2].name = Zwei connections[2].num = 2<br />
Vor dem Kopiervorgang<br />
Nach dem Kopiervorgang<br />
Leerer Konstruktor<br />
connections[1].name = connections[1].num = 6507264<br />
Leerer Konstruktor<br />
connections[2].name = connections[2].num = 6507264<br />
connections_cp[1].name = Eins connections_cp[1].num = 1<br />
connections_cp[2].name = Zwei connections_cp[2].num = 2</p>
</blockquote>
<p>Also passiert genau das, was ich vermutet habe.</p>
<p>Die Objekte in connections werden nach connections_cp kopiert und damit sind beide maps unabhängig voneinander.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929800</guid><dc:creator><![CDATA[HändyÄndy]]></dc:creator><pubDate>Wed, 21 Jul 2010 19:58:37 GMT</pubDate></item></channel></rss>