<?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 ich sowas bedenkenlos schreiben?]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>eine kleine Frage: Ich habe eine Klasse:</p>
<pre><code>class Punkt
{
private:
   std::vector&lt;float&gt; *coordinates;
public:
   Punkt(size_t numOfCoordinates);
   // ... weitere Funktionen ...
};

Punkt::Punkt(size_t numOfCoordinates)
{
   coordinates = new std::vector&lt;float&gt;();
}
</code></pre>
<p>Wenn ich jetzt in einer Funktion diese Klasse verwende, beispielsweise:</p>
<pre><code>function generatePoints()
{
   Punkt p1(2);
   Punkt p2(2);
   // ... mach irgendwas mit den Punkten
}
</code></pre>
<p>Was passiert mit meinem Pointer <strong>coordinates</strong>? Bleibt er irgendwo im Speicher übrig, muss ich das selbst frei machen, macht das C++ automatisch oder was passiert mit dem Pointer und den Daten / Speicherplatz?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327477/kann-ich-sowas-bedenkenlos-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 01:03:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327477.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Aug 2014 08:51:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 08:51:55 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>eine kleine Frage: Ich habe eine Klasse:</p>
<pre><code>class Punkt
{
private:
   std::vector&lt;float&gt; *coordinates;
public:
   Punkt(size_t numOfCoordinates);
   // ... weitere Funktionen ...
};

Punkt::Punkt(size_t numOfCoordinates)
{
   coordinates = new std::vector&lt;float&gt;();
}
</code></pre>
<p>Wenn ich jetzt in einer Funktion diese Klasse verwende, beispielsweise:</p>
<pre><code>function generatePoints()
{
   Punkt p1(2);
   Punkt p2(2);
   // ... mach irgendwas mit den Punkten
}
</code></pre>
<p>Was passiert mit meinem Pointer <strong>coordinates</strong>? Bleibt er irgendwo im Speicher übrig, muss ich das selbst frei machen, macht das C++ automatisch oder was passiert mit dem Pointer und den Daten / Speicherplatz?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413407</guid><dc:creator><![CDATA[starki]]></dc:creator><pubDate>Thu, 14 Aug 2014 08:51:55 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 08:54:42 GMT]]></title><description><![CDATA[<p>starki schrieb:</p>
<blockquote>
<p>Was passiert mit meinem Pointer <strong>coordinates</strong>? Bleibt er irgendwo im Speicher übrig, muss ich das selbst frei machen, macht das C++ automatisch oder was passiert mit dem Pointer und den Daten / Speicherplatz?</p>
</blockquote>
<p>Jup, Du hast das Problem erfaßt. Der bleibt im Speicher übrig. Du müßtest ihn freimachen, im Destruktor günstigerweise.</p>
<p>Vermutlich ist eh</p>
<pre><code>class Punkt
{
private:
   std::vector&lt;float&gt; coordinates;
public:
   Punkt(size_t numOfCoordinates);
   // ... weitere Funktionen ...
};
</code></pre>
<p>passender.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413408</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 14 Aug 2014 08:54:42 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 08:54:51 GMT]]></title><description><![CDATA[<p>Der bleibt im Speicher übrig, denn zu jedem new gehört ein delete.<br />
Aus diesem Grund nutzt man in C++ Destruktoren, um die Arbeiten in Konstruktoren rückgängig zu machen.<br />
Dann braucht man aber auch Kopierkonstruktoren, Zuweisungsoperatoren und ggf. dasselbe nochmal mit move.<br />
Deshalb vermeidet man rohes new und delete, sondern nutzt bessere Methoden.<br />
In diesem Fall ist die bessere Methode einfach auf den Pointer zu verzichten und die Koordinaten als normalen Member in der Klasse zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413409</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 14 Aug 2014 08:54:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 08:55:05 GMT]]></title><description><![CDATA[<p>Was du mit new erzeugst, musst du mit delete zerstören (Ausnahme: Smart Pointer).</p>
<p>Warum soll der std::vector überhaupt ein Pointer sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413410</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 14 Aug 2014 08:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 08:57:30 GMT]]></title><description><![CDATA[<p>Das sollte wohl eher so aussehen:</p>
<pre><code>class Punkt
{
private:
   std::vector&lt;float&gt; coordinates; // kein Zeiger
public:
   Punkt(size_t numOfCoordinates);
   // ... weitere Funktionen ...
};

Punkt::Punkt(size_t numOfCoordinates)
   : coordinates(numOfCoordinated, .0f) // Speicher reservieren und mit 0en füllen
{
}
</code></pre>
<p>DAS ist unbedenklich, da der Vektor seinen Speicher am Ende automatisch freigibt.<br />
Deine Variante hat allerdings den Vektor selbst auch nochmal dynamisch angelegt und nirgends freigegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413411</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Thu, 14 Aug 2014 08:57:30 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 08:58:18 GMT]]></title><description><![CDATA[<p>Du musst den Speicher explizit mit <code>delete</code> freigeben. Das sollte im Destruktor von <code>Point</code> gemacht werden:</p>
<pre><code>~Punkt()
{
     delete coordinates;
}
</code></pre>
<p>Aber warum überhaupt einen Pointer auf <code>std::vector</code> ? Besser ist</p>
<pre><code>class Punkt
{
private:
   std::vector&lt;float&gt; coordinates;
public:
   Punkt(size_t numOfCoordinates);
   // ... weitere Funktionen ...
};

Punkt::Punkt(size_t numOfCoordinates)
    : coordinates(numOfCoordinates)
{ }
</code></pre>
<p>Hier musst du den Speicher nicht explizit allozieren und freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413412</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 14 Aug 2014 08:58:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 09:05:21 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Du musst den Speicher explizit mit <code>delete</code> freigeben. Das sollte im Destruktor von <code>Point</code> gemacht werden:</p>
<pre><code>~Punkt()
{
     delete coordinates;
}
</code></pre>
</blockquote>
<p>Nein, das ist dann ganz falsch.<br />
<a href="http://en.wikipedia.org/wiki/Rule_of_three" rel="nofollow">http://en.wikipedia.org/wiki/Rule_of_three</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413414</guid><dc:creator><![CDATA[ro3]]></dc:creator><pubDate>Thu, 14 Aug 2014 09:05:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 09:17:11 GMT]]></title><description><![CDATA[<p>ro3 schrieb:</p>
<blockquote>
<p>icarus2 schrieb:</p>
<blockquote>
<p>Du musst den Speicher explizit mit <code>delete</code> freigeben. Das sollte im Destruktor von <code>Point</code> gemacht werden:</p>
<pre><code>~Punkt()
{
     delete coordinates;
}
</code></pre>
</blockquote>
<p>Nein, das ist dann ganz falsch.<br />
<a href="http://en.wikipedia.org/wiki/Rule_of_three" rel="nofollow">http://en.wikipedia.org/wiki/Rule_of_three</a></p>
</blockquote>
<p>Na klar, man muss natürlich den Rest entsprechend anpassen (hat ja auch niemand etwas anderes gesagt). Deswegen ist es noch lange nicht falsch mit <code>delete</code> den Speicher im Destruktor freizugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413418</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 14 Aug 2014 09:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 09:33:03 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>ro3 schrieb:</p>
<blockquote>
<p>icarus2 schrieb:</p>
<blockquote>
<p>Du musst den Speicher explizit mit <code>delete</code> freigeben. Das sollte im Destruktor von <code>Point</code> gemacht werden:</p>
<pre><code>~Punkt()
{
     delete coordinates;
}
</code></pre>
</blockquote>
<p>Nein, das ist dann ganz falsch.<br />
<a href="http://en.wikipedia.org/wiki/Rule_of_three" rel="nofollow">http://en.wikipedia.org/wiki/Rule_of_three</a></p>
</blockquote>
<p>Na klar, man muss natürlich den Rest entsprechend anpassen (hat ja auch niemand etwas anderes gesagt). Deswegen ist es noch lange nicht falsch mit <code>delete</code> den Speicher im Destruktor freizugeben.</p>
</blockquote>
<p>So wie ich diesen Typ TE hier kenne wird er deinen Code kopieren weil ihm das am naheliegendsten vorkommt. Dann wundert er sich wegen korruptem Speicher und fragt wieder nach.</p>
<p>Wenn, dann muss man ihm die ganze Ladung ins Gesicht blasen:</p>
<pre><code>// Wer einen Destruktor hat ...
~Punkt() {
    delete coordinates;
}

// ... der muss auch einen Kopierkonstruktor ...
Punkt(Punkt const&amp; o)
  : coordinates(o.coordinates) {}

// ... und den Zuweisungsoperator implementieren.
friend void swap(Punkt&amp; a, Punkt&amp; b) {
    std::swap(a.coordinates, b.coordinates);
}
Punkt&amp; operator=(Punkt o) { // google: copy and swap idiom
    std::swap(*this, o);
    return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2413422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413422</guid><dc:creator><![CDATA[ro3]]></dc:creator><pubDate>Thu, 14 Aug 2014 09:33:03 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 09:51:21 GMT]]></title><description><![CDATA[<p>ro3 schrieb:</p>
<blockquote>
<p>Wenn, dann muss man ihm die ganze Ladung ins Gesicht blasen:</p>
<pre><code>// Wer einen Destruktor hat ...
~Punkt() {
    delete coordinates;
}

// ... der muss auch einen Kopierkonstruktor ...
Punkt(Punkt const&amp; o)
  : coordinates(o.coordinates) {}

// ... und den Zuweisungsoperator implementieren.
friend void swap(Punkt&amp; a, Punkt&amp; b) {
    std::swap(a.coordinates, b.coordinates);
}
Punkt&amp; operator=(Punkt o) { // google: copy and swap idiom
    std::swap(*this, o);
    return *this;
}
</code></pre>
</blockquote>
<p>Warum bläst du ihm eine fehlerhafte Ladung ins Gesicht?<br />
Und es fehlt noch move für C++11 (wenn du ihm schon alles vorkauen willst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413425</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 14 Aug 2014 09:51:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 10:00:13 GMT]]></title><description><![CDATA[<p>ro3 schrieb:</p>
<blockquote>
<p>Wenn, dann muss man ihm die ganze Ladung ins Gesicht blasen:</p>
<pre><code>// Wer einen Destruktor hat ...
~Punkt() {
    delete coordinates;
}

// ... der muss auch einen Kopierkonstruktor ...
Punkt(Punkt const&amp; o)
  : coordinates(o.coordinates) {}

// ... und den Zuweisungsoperator implementieren.
friend void swap(Punkt&amp; a, Punkt&amp; b) {
    std::swap(a.coordinates, b.coordinates);
}
Punkt&amp; operator=(Punkt o) { // google: copy and swap idiom
    std::swap(*this, o);
    return *this;
}
</code></pre>
</blockquote>
<p>Da sind die automatisch generierten Konstrukte schon besser, obwohl nur ein kleines Zeichen fehlt (Tipp: es sit ein Stern ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413427</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 14 Aug 2014 10:00:13 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 10:05:17 GMT]]></title><description><![CDATA[<p>Wie willst Du denn den gezeigten Kopierkonstruktor mit einem Stern korrigieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413428</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 14 Aug 2014 10:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 12:43:45 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Wie willst Du denn den gezeigten Kopierkonstruktor mit einem Stern korrigieren?</p>
</blockquote>
<p>Ups <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 />
Ein Fail nach dem anderen <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>Naja so hatte ich mir das gedacht...</p>
<pre><code>// Wer einen Destruktor hat ...
~Punkt() {
    delete coordinates;
}

// ... der muss auch einen Kopierkonstruktor ...
Punkt(Punkt const&amp; o)
  : *coordinates(*o.coordinates) {}

// ... und den Zuweisungsoperator implementieren.
friend void swap(Punkt&amp; a, Punkt&amp; b) {
    std::swap(a.coordinates, b.coordinates);
}
Punkt&amp; operator=(Punkt o) { // google: copy and swap idiom
    std::swap(*this, o);
    return *this;
}
</code></pre>
<p><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/2413477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413477</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 14 Aug 2014 12:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Thu, 14 Aug 2014 13:23:21 GMT]]></title><description><![CDATA[<p>Ich könnte noch mal <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="😉"
    /><br />
Da fehlt dann noch ein <code>new</code> in Zeile 8:</p>
<pre><code>Punkt( const Punkt&amp; rhs ) :
   coordinates( new vector&lt;float&gt;( *rhs.coordinates ) )
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2413486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413486</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Thu, 14 Aug 2014 13:23:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kann ich sowas bedenkenlos schreiben? on Fri, 15 Aug 2014 07:21:43 GMT]]></title><description><![CDATA[<p>Man sind wir hier pervers <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/2413566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413566</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Fri, 15 Aug 2014 07:21:43 GMT</pubDate></item></channel></rss>