<?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[Kopierkonstruktor ohne Speicher freigeben?]]></title><description><![CDATA[<p>Ich hatte gerade ziemliche Probleme mit std::vector.push_back(), da die verwendete Klasse ja anscheinend bis auf einen Konstruktor und einen Destruktor auch einen Kopierkonstruktor braucht. So ganz verstehen tue ich das nicht.</p>
<p>Zur eigentlichen Frage: Warum muss man im Kopierkonstruktor keine Daten freigeben?</p>
<pre><code class="language-cpp">meinklasse::meineklasse() {
     element1 = new int;
}

...

meineklasse aaa();
meineklasse xy(); //konstruktor initialisiert daten
xy = aaa; //daten werden aus aaa nach xy kopiert
</code></pre>
<p>Logischerweise müsste der Speicher, der im xy-Konstruktor allokiiert wurde, jetzt ohne Referenz frei im Speicher rumschweben. Warum ist das nicht so?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306271/kopierkonstruktor-ohne-speicher-freigeben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 08:59:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306271.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Jul 2012 12:06:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:06:39 GMT]]></title><description><![CDATA[<p>Ich hatte gerade ziemliche Probleme mit std::vector.push_back(), da die verwendete Klasse ja anscheinend bis auf einen Konstruktor und einen Destruktor auch einen Kopierkonstruktor braucht. So ganz verstehen tue ich das nicht.</p>
<p>Zur eigentlichen Frage: Warum muss man im Kopierkonstruktor keine Daten freigeben?</p>
<pre><code class="language-cpp">meinklasse::meineklasse() {
     element1 = new int;
}

...

meineklasse aaa();
meineklasse xy(); //konstruktor initialisiert daten
xy = aaa; //daten werden aus aaa nach xy kopiert
</code></pre>
<p>Logischerweise müsste der Speicher, der im xy-Konstruktor allokiiert wurde, jetzt ohne Referenz frei im Speicher rumschweben. Warum ist das nicht so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234902</guid><dc:creator><![CDATA[Telefonmann]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:15:03 GMT]]></title><description><![CDATA[<p><code>xy = aaa</code> benutzt <code>operator=</code> und nicht den Kopierkonstruktor. Da muss man dann auch den Speicher wieder freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234909</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:15:03 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:15:07 GMT]]></title><description><![CDATA[<p>Telefonmann schrieb:</p>
<blockquote>
<p>Zur eigentlichen Frage: Warum muss man im Kopierkonstruktor keine Daten freigeben?</p>
</blockquote>
<p>Der Kopierkonstruktor erzeugt eine Instanz. Wieso sollte man da Daten freigeben?</p>
<p>Telefonmann schrieb:</p>
<blockquote>
<pre><code class="language-cpp">meineklasse aaa();
meineklasse xy(); //konstruktor initialisiert daten
xy = aaa; //daten werden aus aaa nach xy kopiert
</code></pre>
</blockquote>
<p>hier verwendest du aber keinen Kopierkonstruktor...</p>
<p>Telefonmann schrieb:</p>
<blockquote>
<p>Logischerweise müsste der Speicher, der im xy-Konstruktor allokiiert wurde, jetzt ohne Referenz frei im Speicher rumschweben. Warum ist das nicht so?</p>
</blockquote>
<p>Ohne Kenntnis von Zuweisungsoperator und Destruktor lässt sich die Frage nicht beantworten. Angenommen, du hast diese Methoden nciht selbst implementiert: Dann hast du eine Menge Speicherlöcher.</p>
<p>Vielleicht solltest du dich mal mit &quot;Smart Pointer&quot; beschäftigen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234910</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:15:07 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:18:38 GMT]]></title><description><![CDATA[<p>daddy_felix schrieb:</p>
<blockquote>
<p>Vielleicht solltest du dich mal mit &quot;Smart Pointer&quot; beschäftigen...</p>
</blockquote>
<p>Oder gar keine Pointer. Die Beschreibung klingt nach einem dieser typischen Fälle, wo new benutzt wird, wo ein normaler Member ausreichend wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234915</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:18:38 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:27:30 GMT]]></title><description><![CDATA[<p>Sorry, dachte ich könnte mal eben nen Beispiel aus dem Kopf tippen <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="😃"
    /><br />
War wohl daneben</p>
<p>Ich demonstriere einfach mal mein problem. Ich wollte einen Wrapper (immer noch zum Üben und Rumprobieren) für die pcap-Library basteln.<br />
Um die Devices anzuzeigen, wollte ich einen Vektor a la CDevice (eine Klasse von mir) benutzen.</p>
<pre><code class="language-cpp">int CPcap::ListAllDevices(std::vector&lt;CDevice&gt;&amp; aDevices) {
	int ret_finddevs;
	pcap_if_t *devices;
	//============================================&gt;
	aDevices.clear();
	ret_finddevs = pcap_findalldevs(&amp;devices, _errorbuf);
	if (ret_finddevs == 0) {
		for (pcap_if_t* myDevice = devices;myDevice;myDevice = myDevice-&gt;next) {
			aDevices.push_back(myDevice);
		}
		pcap_freealldevs(devices);
	}
	return ret_finddevs;
}
</code></pre>
<p>Diese Funktion liest die Devices ein und speichert sie im Vektor ab.<br />
Hier ist die Klasse CDevice:</p>
<pre><code class="language-cpp">#pragma once

#include &quot;Address.h&quot;
#include &lt;pcap.h&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

class CDevice
{
public:
	//Methoden
	CDevice(const pcap_if_t *myDevice);
	~CDevice(void);
	CDevice(const CDevice&amp; rhs);
	//Elemente
	char *name, *description;
	u_int flags;
	std::vector&lt;CAddress&gt; aAddresses; //kümmern wir uns später drum
private:
	//Methoden
	//Elemente
};
</code></pre>
<pre><code class="language-cpp">#include &quot;Device.h&quot;

CDevice::CDevice(const pcap_if_t *myDevice) //Konstruktor
{
	//====================================&gt;
	name = new char[strlen(myDevice-&gt;name)+1];
	memcpy(name, myDevice-&gt;name, strlen(myDevice-&gt;name)+1);
	description = new char[strlen(myDevice-&gt;description)+1];
	memcpy(description, myDevice-&gt;description, strlen(myDevice-&gt;description)+1);
	flags = myDevice-&gt;flags;
}

CDevice::~CDevice(void)
{
	delete[] name;
	delete[] description;
}

CDevice::CDevice(const CDevice&amp; rhs) {
	name = new char[strlen(rhs.name)+1];
	strcpy(name, rhs.name);
	description = new char[strlen(rhs.description)+1];
	strcpy(description, rhs.description);
	flags = rhs.flags;

}
</code></pre>
<p>Der Code funktioniert zwar, aber ich verstehe nicht, warum ich da einen Kopierkonstruktor brauche (und ja, ich habe den Code selber geschrieben. Google meinte, dass man für push_back einen Kopierkonstruktor braucht).</p>
<p>Ich möchte in diesem Fall nur ungern std::string benutzen, da die Klasse kompatibel zu den Funktionen der pcap-Library bleiben soll. Man könnte hier bestimmt auch std::string verwenden, will ich aber gerade nicht (ich will verstehen, warum ich hier einen Kopierkonstruktor brauche).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234919</guid><dc:creator><![CDATA[Telefonmann]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:27:30 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:35:37 GMT]]></title><description><![CDATA[<p>Der Kopierkonstruktor wird genutzt, wenn Objekte per push_back hinzugefügt werden. Ein Kopierkonstruktor wird automatisch erzeugt, nur macht dieser nicht immer das, was du möchtest. Wenn du einen Pointer als Member hast, wird dieser Pointer vom automatisch generierten Kopierkonstruktor kopiert - nicht aber das Objekt, auf das der Pointer zeigt.</p>
<p>Wenn du im Konstruktor den Speicherplatz mit &quot;new&quot; erzeugst und anschließend ein neues Objekt per Kopierkonstruktor erstellst, hast du zwei Pointer, die auf dasselbe Objekt zeigen. Wenn nun ein Objekt zerstört wird, dann ruft der Destruktor (hoffentlich!) &quot;delete&quot; auf - und der zweite Pointer zeigt ins Nirvana.</p>
<p>Deshalb musst du einen eigenen Kopierkonstruktor schreiben, der nicht nur den Pointer kopiert, sondern das referenzierte Objekt. Gleiches gilt für den Zuweisungsoperator - google mal nach &quot;Regel der großen Drei&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234922</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:40:59 GMT]]></title><description><![CDATA[<p>Den Kopierkonstruktor brauchst du, weil vector den Kopierkonstruktor benutzt, um Elemente zu, äh, kopieren.</p>
<p>Ein push_back ist keine Zuweisung. Dazu müsste dann ja erst ein Leerelement erzeut werden (und wie sähe dieses aus?), welches sofort überschrieben wird. Es ist auch (zumindest im Allgemeinen) keine Verschiebung, da sonst schließlich das Original hinterher weg wäre.</p>
<p>new[] ist <strong>niemals</strong> eine bessere Alternative zu vector oder string. Wenn du dich über mangelnde Kompatibilität des Interfaces beschwerst, dann kennst du anscheinend das interface von vector und string nicht gut genug. Dieses ist kompatibel zu den Arrays im C-Stil:<br />
String:<br />
<a href="http://www.cplusplus.com/reference/string/string/c_str/" rel="nofollow">http://www.cplusplus.com/reference/string/string/c_str/</a><br />
<a href="http://www.cplusplus.com/reference/string/string/data/" rel="nofollow">http://www.cplusplus.com/reference/string/string/data/</a><br />
Achtung, der Bereich den data und c_str zurück geben, ist const!<br />
Vector:<br />
<a href="http://www.cplusplus.com/reference/stl/vector/operator%5B%5D/" rel="nofollow">http://www.cplusplus.com/reference/stl/vector/operator[]/</a><br />
Es ist garantiert, dass die Elemente hintereinander und dicht im Speicher liegen, d.h. &amp;charvector[0] entspricht einem Zeiger auf den Anfang eines char-Arrays. Und der Bereich ist nicht const! Oder in C++11 in Kurzschreibweise:<br />
<a href="http://en.cppreference.com/w/cpp/container/vector/data" rel="nofollow">http://en.cppreference.com/w/cpp/container/vector/data</a><br />
Bei vector ist data nicht const!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234924</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:40:59 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:42:34 GMT]]></title><description><![CDATA[<p>Ich wollte eigentlich wissen, warum push_back nicht einfach ein neues Objekt erzeugt... Dann könnte er sich den Kopierkonstruktor sparen. Wenn ich das richtig verstanden habe, erzeugt push_back ein neues Objekt mit dem Kontruktorargument und kopiert es anschliessend zu sich selbst... Warum erstellt er nicht einfach ein neues Objekt und lässt das Kopieren weg?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234925</guid><dc:creator><![CDATA[Telefonmann]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:42:34 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:52:06 GMT]]></title><description><![CDATA[<p>Ordne eine Ressource sofort einem Objekt zu, so lokal wie möglich. Und lass ein Objekt nach Möglichkeit nicht mehrere Ressourcen direkt/manuell verwalten.</p>
<p>ListAllDerives ist nicht Ausnahme-sicher, da Du manuell pcap_freealldevs aufrufen musst, es aber vorher zu einer Ausnahme kommen könnte.</p>
<p>name/description in CDevice sind &quot;owning raw pointers&quot;. Pfui. Du kannst dir viel Ärger ersparen, indem Du die Ressourcenverwaltung von CDevice für <em>mehrere</em> Ressourcen (generell schlecht, nimm ein Objekt pro Ressource) eine Ebene tiefer verlagerst: <code>std::string</code> statt <code>char*</code> . Dann kannst du dir auch sparen, Kopierkonstruktor, Zuweisungsoperator und Destruktor von CDevice selbst zu definieren.</p>
<p>Warum kompliziert wenn es auch einfach geht?</p>
<p>Schaff dir ein gescheites Buch an, was dir C++ richtig beibringt.</p>
<p>Telefonmann schrieb:</p>
<blockquote>
<p>Ich möchte in diesem Fall nur ungern std::string benutzen,</p>
</blockquote>
<p><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>
<p>Telefonmann schrieb:</p>
<blockquote>
<p>ich will verstehen, warum ich hier einen Kopierkonstruktor brauche</p>
</blockquote>
<p>Was ist das denn für eine Aussage?<br />
Ein Kopierkonstruktor ist immer dann nötig, wenn du ein neues Objekt als Kopie erzeugen willst. Ein Zuweisungsoperator ist immer dann nötig, wenn du einem Objekt den &quot;Wert&quot; eines anderen zuweisen willst. Klar oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234927</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:52:06 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:51:06 GMT]]></title><description><![CDATA[<p>Telefonmann schrieb:</p>
<blockquote>
<p>Ich wollte eigentlich wissen, warum push_back nicht einfach ein neues Objekt erzeugt...</p>
</blockquote>
<p>tut es doch.</p>
<p>Telefonmann schrieb:</p>
<blockquote>
<p>Wenn ich das richtig verstanden habe, erzeugt push_back ein neues Objekt mit dem Kontruktorargument und kopiert es anschliessend zu sich selbst...</p>
</blockquote>
<p>Das hast du falsch verstanden. Schau dir doch den Kopierkonstruktor nochmal genau an. Dieser funktioniert so:</p>
<pre><code class="language-cpp">XXX defaultObject(); // default constructor
XXX argumentObject(&quot;Hello&quot;); // constructor with arguments

XXX copyObject(defaultObject); // copy constructor
XXX assignment = argumentObject; // assignment operator
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2234928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234928</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:51:06 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 12:53:24 GMT]]></title><description><![CDATA[<p>daddy_felix schrieb:</p>
<blockquote>
<pre><code class="language-cpp">XXX defaultObject(); // default constructor
</code></pre>
</blockquote>
<p>Du meinst wahrscheinlich <code>// Funktionsdeklaration</code> ... <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/2234929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234929</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 23 Jul 2012 12:53:24 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 13:05:02 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>daddy_felix schrieb:</p>
<blockquote>
<pre><code class="language-cpp">XXX defaultObject(); // default constructor
</code></pre>
</blockquote>
<p>Du meinst wahrscheinlich <code>// Funktionsdeklaration</code> ... <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>
</blockquote>
<p>Bei dir ist der Name aber auch Programm <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="😉"
    /> Das kommt davon, wenn man gerade drei Wochen Urlaub hatte...</p>
<pre><code class="language-cpp">XXX defaultObject; // default constructor
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2234932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234932</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 23 Jul 2012 13:05:02 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 13:28:18 GMT]]></title><description><![CDATA[<p>Telefonmann schrieb:</p>
<blockquote>
<p>Wenn ich das richtig verstanden habe, erzeugt push_back ein neues Objekt mit dem Kontruktorargument und kopiert es anschliessend zu sich selbst</p>
</blockquote>
<p><code>push_back</code> übernimmt als Parameter nicht den Konstruktorparameter für das neue Objekt, sondern ein vorhandenes Objekt, welches dann in den Vektor kopiert wird. An dieser Stelle tritt die Kopie auf. In deinem Fall funktioniert das trotzdem, weil CDevice einen nicht- <code>explicit</code> Konstruktor besitzt, der ein <code>pcap_if_t*</code> als Parameter besitzt, mit diesem kann der Compiler an der Stelle <code>aDevices.push_back(myDevice)</code> ein temporäres CDevice-Objekt erzeugen, welches dann <code>push_back</code> als Parameter übergeben wird.<br />
Seit C++11 unterstützt <code>vector</code> auf das Einfügen mit direkter Übergabe der Konstruktorparameter für das neu zu erstellende Objekt, womit diese Kopie wegfallen kann. Die Methode dazu heißt <code>emplace_back</code> .</p>
<p>Generell sollte man aber immer einen funktionierenden Kopierkonstruktor implementieren (oder diesen zur Not unzugänglich machen), da von C++-Objekten funktionierende Kopiersemantik erwartet wird. Noch besser ist es aber, die Resourcen (insbesondere die Pointer) nicht selbst zu verwalten, dann machen die compilergenerierten Kopierkonstruktoren und Zuweisungsoperatoren schon das richtige und man muss sich darum überhaupt nicht kümmern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234934</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 23 Jul 2012 13:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 13:40:45 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16077">@ipsec</a> Jaaa, genau das meinte ich.</p>
<p>Nur folgendes verstehe ich nicht ganz:</p>
<blockquote>
<p>Ordne eine Ressource sofort einem Objekt zu, so lokal wie möglich.<br />
...<br />
ListAllDerives ist nicht Ausnahme-sicher, da Du manuell pcap_freealldevs aufrufen musst, es aber vorher zu einer Ausnahme kommen könnte.</p>
</blockquote>
<p>Zu 1) Warum sollte ich die Elemente lokal initialisieren? (schon wieder was falsch verstanden?)</p>
<p>Zu 2) Meinst du eine potentielle Ausnahme bei:</p>
<pre><code class="language-cpp">aDevices.clear();
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234940</guid><dc:creator><![CDATA[Telefonmann]]></dc:creator><pubDate>Mon, 23 Jul 2012 13:40:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 14:23:48 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>new[] ist <strong>niemals</strong> eine bessere Alternative zu vector oder string.</p>
</blockquote>
<p>Wirklich niemals? Ich könnte mir Fälle vorstellen, in denen man sehr viele sehr kleine Arrays dynamischer, implizit gegebener Größe benötigt, bei denen der Overhead von vector zu viel Speicher verbrauchen würde. Von daher würde ich sagen, dass new[] <strong>fast nie</strong> eine bessere Alternative zu vector ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234953</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Mon, 23 Jul 2012 14:23:48 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 14:35:37 GMT]]></title><description><![CDATA[<p>und selbst dann gibt es immer ncoh sowas wie smart pointer auf arrays, shared_array oder so von boost ist das dann...</p>
<p>und einfach mal so eine ganze reihe kleiner arrays erstellen hört sich auch nicht ganz sauber an, denke da gibt es dan im konkreten fall bessere alternativen (und sau es um &quot;nur&quot; etwaige ausnahmesicherheiten zu garantieren)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234955</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 23 Jul 2012 14:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 15:01:33 GMT]]></title><description><![CDATA[<p>Telefonmann schrieb:</p>
<blockquote>
<p>Nur folgendes verstehe ich nicht ganz:</p>
<blockquote>
<p>Ordne eine Ressource sofort einem Objekt zu, so lokal wie möglich.<br />
...<br />
ListAllDerives ist nicht Ausnahme-sicher, da Du manuell pcap_freealldevs aufrufen musst, es aber vorher zu einer Ausnahme kommen könnte.</p>
</blockquote>
<p>Zu 1) Warum sollte ich die Elemente lokal initialisieren? (schon wieder was falsch verstanden?)</p>
</blockquote>
<p>Ich habe mich wahrscheinlich nur blöd ausgedrückt, hatte aber versucht das noch weiter zu beschreiben. Mal an einfachen Beispielen:</p>
<p>doof: (klasse person muss sich um mehrere Ressourcen selbst kümmern)</p>
<pre><code class="language-cpp">class person
{
  char* vorname;
  char* nachname;
public:
  person(const char* vn, const char* nn);
  ~person();
  person(person const&amp;);
  person&amp; operator=(person const&amp;);
};
</code></pre>
<p>schlau: (klasse person kümmert sich um nix. mystring um nur jeweils genau eine Ressource)</p>
<pre><code class="language-cpp">class mystring
{
  char* data;
public:
  ~mystring()
  mystring(mystring const&amp;);
  mystring&amp; operator=(mystring const&amp;);
  ...
};

class person
{
  mystring vorname;
  mystring nachname;
public:
  person(const char* vn, const char* nn);
};
</code></pre>
<p>Das meinte ich mit &quot;lokal&quot; ... ist vielleicht nicht das beste Wort dafür, aber ich hoffe, du weißt, wie das gemeint ist.</p>
<p>... und statt mystring nimmste einfach std::string aus dem &lt;string&gt;-Header.</p>
<p>Telefonmann schrieb:</p>
<blockquote>
<p>Zu 2) Meinst du eine potentielle Ausnahme bei:</p>
<pre><code class="language-cpp">aDevices.clear();
</code></pre>
<p>?</p>
</blockquote>
<p>Nee, eher bei den push_backs, die du da machst. Gewöhne dir einfach ab, Ressourcen zu &quot;acquirieren&quot; (Speicher, Datei handles, Locks, etc), ohne dabei die Verantwortung bzgl der Freigabe an ein Objekt abzutreten. Wenn du meinst, Kopierkonstruktor, Zuweisungsoperator und Destrkutor von sehr vielen deiner Klassen selbst definieren zu müssen, hast du echt etwas falsch gemacht, siehe person-Klassenbeispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234959</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 23 Jul 2012 15:01:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 15:20:02 GMT]]></title><description><![CDATA[<p>Ah, ok. Habs verstanden. Danke dir <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234967</guid><dc:creator><![CDATA[Telefonmann]]></dc:creator><pubDate>Mon, 23 Jul 2012 15:20:02 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 15:53:30 GMT]]></title><description><![CDATA[<p>Ramanujan schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>new[] ist <strong>niemals</strong> eine bessere Alternative zu vector oder string.</p>
</blockquote>
<p>Wirklich niemals? Ich könnte mir Fälle vorstellen, in denen man sehr viele sehr kleine Arrays dynamischer, implizit gegebener Größe benötigt, bei denen der Overhead von vector zu viel Speicher verbrauchen würde. Von daher würde ich sagen, dass new[] <strong>fast nie</strong> eine bessere Alternative zu vector ist.</p>
</blockquote>
<p>Welchen Overhead gegenüber new[] hat std::vector denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234973</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 23 Jul 2012 15:53:30 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 15:57:01 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Ramanujan schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>new[] ist <strong>niemals</strong> eine bessere Alternative zu vector oder string.</p>
</blockquote>
<p>Wirklich niemals? Ich könnte mir Fälle vorstellen, in denen man sehr viele sehr kleine Arrays dynamischer, implizit gegebener Größe benötigt, bei denen der Overhead von vector zu viel Speicher verbrauchen würde. Von daher würde ich sagen, dass new[] <strong>fast nie</strong> eine bessere Alternative zu vector ist.</p>
</blockquote>
<p>Welchen Overhead gegenüber new[] hat std::vector denn?</p>
</blockquote>
<p>Praktisch hat vector in der Regel die Größe von 3 Pointern, wohingegen bei new ein Pointer und eine Größenangabe (~eine weitere Pointergröße) reicht, sofern man nicht vor hat, das Array zu vergrößern.</p>
<p>Das Beispiel ist derart konstruiert, dass ich bei nie bleibe. Wenn wir wirklich immer alle möglichen Ausnahmen berücksichtigen, dann kann man in diesem Forum gar nichts mehr sagen, ohne immer ein &quot;fast&quot; in die Aussage aufzunehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234974</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jul 2012 15:57:01 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 16:19:58 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wenn wir wirklich immer alle möglichen Ausnahmen berücksichtigen, dann kann man in diesem Forum gar nichts mehr sagen, ohne immer ein &quot;fast&quot; in die Aussage aufzunehmen.</p>
</blockquote>
<p>Man sollte auch fast nie nie schreiben, sondern fast immer fast nie <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2234978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234978</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 23 Jul 2012 16:19:58 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 18:17:39 GMT]]></title><description><![CDATA[<p>Bitte tötet mich nicht bei meinen ganzen blöden Fragen ...</p>
<p>Ich versuche gerade eine Klasse in eine andere Klasse einzukapseln. Das problem ist nur, dass die Klasse CEthernet umbedingt Parameter für den Konstruktor braucht. Momentan habe ich dies mit einem Pointer gelöst. Kann man das auch ohne Pointer lösen oder muss das so sein? Ist das in diesem Fall in Ordnung oder sollte man da lieber eine extra Methode zum Einlesen schreiben? (Ich meine soetwas ähnliches schonmal bei QT gesehen zu haben)</p>
<pre><code class="language-cpp">class CPacket
{
public:
	//Methoden
	CPacket(const struct pcap_pkthdr *pkt_header, const u_char *pkt_data);
	~CPacket(void);
	//Elemente
	CEthernet *eth;

private:
};

class CEthernet
{
public:
	//Methoden
	CEthernet(const struct pcap_pkthdr *pkt_header, const u_char *pkt_data);
	~CEthernet(void);
	//Elemente
	u_char dstmac[6], srcmac[6];
	short frametype;
};

...

CPacket::CPacket(const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
{
	//======================================================&gt;
	//Ethernet-Schicht einlesen (14 Bytes)
	eth = new CEthernet(pkt_header, pkt_data); //unschön?
}

CPacket::~CPacket(void)
{
	delete eth;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2234993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234993</guid><dc:creator><![CDATA[Telefonmann]]></dc:creator><pubDate>Mon, 23 Jul 2012 18:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 18:21:11 GMT]]></title><description><![CDATA[<p>C-Präfixe kotzen mich an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234996</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 23 Jul 2012 18:21:11 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 19:27:43 GMT]]></title><description><![CDATA[<p>Telefonmann schrieb:</p>
<blockquote>
<p>Ich versuche gerade eine Klasse in eine andere Klasse einzukapseln. Das problem ist nur, dass die Klasse CEthernet umbedingt Parameter für den Konstruktor braucht.</p>
</blockquote>
<p>Initialisierungsliste</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235006</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 23 Jul 2012 19:27:43 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 19:35:34 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>C-Präfixe kotzen mich an.</p>
</blockquote>
<p><code>KPacket, KEthernet</code> - besser? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235007</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 23 Jul 2012 19:35:34 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor ohne Speicher freigeben? on Mon, 23 Jul 2012 19:44:51 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Kellerautomat schrieb:</p>
<blockquote>
<p>C-Präfixe kotzen mich an.</p>
</blockquote>
<p><code>KPacket, KEthernet</code> - besser? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Btw: Was hab ich mir eigentlich unter einem &quot;Ethernet&quot;-Objekt vorzustellen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235008</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 23 Jul 2012 19:44:51 GMT</pubDate></item></channel></rss>