<?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 und Speicherverwaltung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich gehe gerade ein paar Übungen durch und bei einer weiß ich nicht genau, was das Problem ist bzw. was genau verlangt wird. Hier das Beispiel:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;

using namespace std;

class CFeld {
	char *p;

public:
	CFeld(char *s);
	void drucke() {
		cout &lt;&lt; p &lt;&lt; endl;
	}
};

CFeld::CFeld(char *s) {
	p = char[strlen(s) + 1];
}

int main() {
	int i;
	char cp[] = &quot;Feld x&quot;;
	CFeld cfp(cp);
	return 0;
}
</code></pre>
<p>- Das Programm übersetzt nicht!<br />
- Ein Fehler, korrigieren!<br />
- Was könnte eine Warnung erzeugen?</p>
<p>Das Problem ist bei dieser Zeile p = char[strlen(s) + 1];<br />
p kann nur char Adresse zugewiesen werden... Wie soll ich das lösen?</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326996/kopierkonstruktor-und-speicherverwaltung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Jul 2026 02:46:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326996.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Jul 2014 15:27:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kopierkonstruktor und Speicherverwaltung on Fri, 18 Jul 2014 15:27:54 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich gehe gerade ein paar Übungen durch und bei einer weiß ich nicht genau, was das Problem ist bzw. was genau verlangt wird. Hier das Beispiel:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;

using namespace std;

class CFeld {
	char *p;

public:
	CFeld(char *s);
	void drucke() {
		cout &lt;&lt; p &lt;&lt; endl;
	}
};

CFeld::CFeld(char *s) {
	p = char[strlen(s) + 1];
}

int main() {
	int i;
	char cp[] = &quot;Feld x&quot;;
	CFeld cfp(cp);
	return 0;
}
</code></pre>
<p>- Das Programm übersetzt nicht!<br />
- Ein Fehler, korrigieren!<br />
- Was könnte eine Warnung erzeugen?</p>
<p>Das Problem ist bei dieser Zeile p = char[strlen(s) + 1];<br />
p kann nur char Adresse zugewiesen werden... Wie soll ich das lösen?</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2409257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409257</guid><dc:creator><![CDATA[chris9360]]></dc:creator><pubDate>Fri, 18 Jul 2014 15:27:54 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Speicherverwaltung on Fri, 18 Jul 2014 15:36:19 GMT]]></title><description><![CDATA[<p>Die Header <code>&lt;string.h&gt;</code> und <code>&lt;stdlib.h&gt;</code> sind deprecated; nimm die C++-Äquivalente <code>&lt;cstring&gt;</code> und <code>&lt;cstdlib&gt;</code> , wenn überhaupt nötig.<br />
Warum deklarierst du einen <code>int</code> in der <code>main</code> den du nirgens nutzt?<br />
Warum setzt du ein C vor deinen Klassennamen?</p>
<pre><code>CFeld::CFeld(char *s) {
    p = char[strlen(s) + 1];
}
</code></pre>
<p>Ist ausgemachter Unsinn, aus mehreren Gründen:<br />
- Der Konstruktor will den übergebenen String nicht modifizieren; warum nimmt er aber einen Zeiger auf non-const <code>char</code> ?<br />
- Der <code>p</code> wurde nirgends anderweitig initialisiert und müsste erst einmal auf gültigen Speicher zeigen. Dann hättest du aber auch Speicherverwaltung am Halse.<br />
- Der Inhalt muss kopiert werden - mittels <code>strcpy</code> ?<br />
- Der Code den du da so stehen hast ist völlig unsinnig. Einfach Raten hilft hier nicht!</p>
<p>C++ ist das sicherlich nicht - eher C mit Klassen. Naja, nicht einmal das.</p>
<p>Du benötigst <code>std::string</code> . - folgender Code ist ungetestet.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt; // Das ist der benötigte Header

class CFeld {
    std::string mText;

public:
    CFeld(char const*s);

    void drucke() const // verändert nix, daher const
    {
        std::cout &lt;&lt; p &lt;&lt; '\n'; // Hihi, du willst einen Zeilenumbruch, keinen Zeilenumbruch
    }
};

CFeld::CFeld(char const*s) :
    mText(s)
{}

int main()
{
    char cp[] = &quot;Feld x&quot;;
    CFeld cfp(cp);
} // return-Statement hier überflüssig
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2409258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409258</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 18 Jul 2014 15:36:19 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Speicherverwaltung on Fri, 18 Jul 2014 15:54:55 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>- Der Code den du da so stehen hast ist völlig unsinnig. Einfach Raten hilft hier nicht!</p>
</blockquote>
<p>Wie gesagt, das ist eine Übung bzw. Kontrollfrage. Ich habe das Programm nicht geschrieben. Gegeben ist das Programm und die drei Punkte:<br />
- Das Programm übersetzt nicht!<br />
- Ein Fehler, korrigieren!<br />
- Was könnte eine Warnung erzeugen?<br />
Ich soll ja das Programm nicht umschreiben, sondern angeblich einen Fehler finden <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/2409263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409263</guid><dc:creator><![CDATA[chris9360]]></dc:creator><pubDate>Fri, 18 Jul 2014 15:54:55 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Speicherverwaltung on Fri, 18 Jul 2014 16:25:11 GMT]]></title><description><![CDATA[<p>@Arcoth</p>
<blockquote>
<p>Der Code den du da so stehen hast ist völlig unsinnig. Einfach Raten hilft hier nicht!</p>
</blockquote>
<p>Ach, stell dich mal nicht blöder als du bist. Ist doch vollkommen klar was das Programm machen sollte.</p>
<p>@chris9360<br />
In welcher Zeile der Fehler ist sagt dir ja der Compiler wenn du versuchst den Code zu übersetzen.</p>
<pre><code class="language-cpp">p = char[strlen(s) + 1];
</code></pre>
<p>Das kann schonmal nicht kompilieren.</p>
<p>Damit ist der <em>&quot;- Das Programm übersetzt nicht!&quot;</em> Teil erledigt.</p>
<p>Was gemeint ist: fordere ein char-Array an das gross genug ist um den String &quot;s&quot; zu halten, und weise die Adresse dieses neuen char-Arrays &quot;p&quot; zu.</p>
<p>Du sollst die Zeile jetzt korrigieren, so dass da gültiger C++ Code steht der das macht was ich gerade beschrieben habe.<br />
Tip: Dazu reicht es diese Zeile minimal anzupassen.</p>
<p>Damit ist der <em>&quot;- Ein Fehler, korrigieren!&quot;</em> Teil erledigt.</p>
<p>Damit sollte das Programm dann mal kompilieren. (*)</p>
<p>Und dann noch zu <em>&quot;- Was könnte eine Warnung erzeugen?&quot;</em> ein kleiner Tip: guck dir die main() Funktion an. Da steht was, was überhaupt komplett sinnfrei ist. Ist zwar gültiges C++, aber wie gesagt vollkommen sinnfrei. So eindeutig und klar sinnfrei, dass manche Compiler dafür ne Warning generieren.<br />
Was könnte das sein?</p>
<p>----</p>
<p>*:<br />
Sinn macht es damit immer noch nicht, denn um Sinn zu machen müsste dann noch der Inhalt des übergebenen Strings &quot;s&quot; in das neu erzeugte Array kopiert werden.<br />
Das wird lustigerweise in der Aufgabenstellung nicht erwähnt - k.A. ob das Absicht oder ein Oversight ist oder was auch immer.</p>
<p>Und um dann &quot;wirklich&quot; Sinn zu machen, fehlen noch einige Dinge, wie z.B. der Destruktor in dem der Speicher wieder freigegeben wird, ein Copy-Konstruktor und ein Assignment-Operator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2409268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409268</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 18 Jul 2014 16:25:11 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Speicherverwaltung on Fri, 18 Jul 2014 17:23:30 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich habe das Programm nicht geschrieben.</p>
</blockquote>
<p>Das wusste ich nicht. Ich nahm an dass du das Programm auf gut Glück geschrieben hast und nun die Fehler nicht entdecken bzw. korrigieren kannst. (Schließlich hast du das nirgens explizit gesagt - gut, 'hier ist das Beispiel' hätte mir wohl einleuchten können.)</p>
<blockquote>
<p>Ist doch vollkommen klar was das Programm machen sollte.</p>
</blockquote>
<p>Ja, offensichtlich. Wie gesagt - mir war nicht klar dass das Programm nicht von ihm stammt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2409276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409276</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 18 Jul 2014 17:23:30 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Speicherverwaltung on Fri, 18 Jul 2014 17:33:18 GMT]]></title><description><![CDATA[<p>[quote=&quot;hustbaer&quot;]@Arcoth</p>
<blockquote>
<p>Was gemeint ist: fordere ein char-Array an das gross genug ist um den String &quot;s&quot; zu halten, und weise die Adresse dieses neuen char-Arrays &quot;p&quot; zu.</p>
<p>Du sollst die Zeile jetzt korrigieren, so dass da gültiger C++ Code steht der das macht was ich gerade beschrieben habe.<br />
Tip: Dazu reicht es diese Zeile minimal anzupassen.</p>
</blockquote>
<p>In dieser Zeile</p>
<pre><code>p = char[strlen(s) + 1];
</code></pre>
<p>Steht bei diesem Beispiel</p>
<pre><code>p = char[7];
</code></pre>
<pre><code>strlen(s) + 1
</code></pre>
<p>müsste ja ein konstanter Wert sein.<br />
So funktioniert es</p>
<pre><code>char a[7];
p = a;
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2409278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409278</guid><dc:creator><![CDATA[chris9360]]></dc:creator><pubDate>Fri, 18 Jul 2014 17:33:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Speicherverwaltung on Fri, 18 Jul 2014 18:45:22 GMT]]></title><description><![CDATA[<p>Ich habe es:</p>
<pre><code>p = new char[strlen(s) + 1];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2409288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409288</guid><dc:creator><![CDATA[chris9360]]></dc:creator><pubDate>Fri, 18 Jul 2014 18:45:22 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Speicherverwaltung on Fri, 18 Jul 2014 19:21:54 GMT]]></title><description><![CDATA[<p>chris9360 schrieb:</p>
<blockquote>
<p>Ich habe es:</p>
<pre><code>p = new char[strlen(s) + 1];
</code></pre>
</blockquote>
<p>Ich wette, du hast nun ein Speicherloch eingebaut. Aber vermutlich interessiert das den Aufgabensteller gar nicht, weil er es selber nicht versteht. Schade, dass so ein Müll heutzutage noch als C++ gelehrt wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2409293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409293</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 18 Jul 2014 19:21:54 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor und Speicherverwaltung on Fri, 18 Jul 2014 20:03:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a><br />
Ich hoffe mal dass das in der Übung dann als nächstes kommt.<br />
Man kann ja nicht alles auf einmal lehren/lernen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2409305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2409305</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 18 Jul 2014 20:03:00 GMT</pubDate></item></channel></rss>