<?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[Problem mit malloc und new]]></title><description><![CDATA[<p>Hi zusammen,</p>
<p>Ich bringe mir zur Zeit C++ bei und es hängt schon bei den einfachsten Dingen. Trainingshalber versuche ich meine eigene kleine Stringklasse zu schreiben und bei der Allokation von speicher passieren seltsame dinge:</p>
<p>Der Header:</p>
<pre><code class="language-cpp">class BOBString
	{
	public:
		BOBString(const char *str);
		~BOBString(void);

	private:
		char *str;
		int len;
	};
</code></pre>
<p>Und hier der Konstruktor der die Probleme macht:</p>
<pre><code class="language-cpp">BOBString::BOBString(const char *str)
	{
		//Länge des Parameterstrings herausfinden
		this-&gt;len = strlen(str);

		//Speicher für Klassenattribut str allokieren
		this-&gt;str = new char[this-&gt;len];

		//Pointer um über das Klassenattribut zu enumerieren
		char *targetPos = this-&gt;str;
		for(const char *sourcePos = str; *sourcePos; sourcePos++)
		{
			//SourcePos enumeriert über den Parameter str
			//char aus sourcePos in targetPos schreiben
			*targetPos = *sourcePos;
			targetPos++;
		}
	}
</code></pre>
<p>Und hier noch der Aufruf des Konstruktors:</p>
<pre><code class="language-cpp">INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, INT nCmdShow)
{
	BOBString str(&quot;Hallo&quot;);

    return 0;
}
</code></pre>
<p>In diesem Beispiel passiert folgendes:</p>
<p>this-&gt;len = 5<br />
und in der nächsten Zeile (this-&gt;str = new char[this-&gt;len];) ist<br />
this-&gt;str = ÍÍÍÍÍýýýý««««««««þîþîþîþ<br />
Was viel zu Lang ist, normalerweise sollte es nur ÍÍÍÍÍ sein.<br />
Nach der Schleife steht dann in this-&gt;str der Wert<br />
Halloýýýý««««««««þîþîþîþ</p>
<p>Wieso? Ich versuche das schon seit Tagen zu verstehen und verzweifle so langsam dran.<br />
Vielen Dank für jede Hilfe!</p>
<p>Gruß,<br />
Bob</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291302/problem-mit-malloc-und-new</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 20:37:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291302.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Aug 2011 07:13:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 07:13:16 GMT]]></title><description><![CDATA[<p>Hi zusammen,</p>
<p>Ich bringe mir zur Zeit C++ bei und es hängt schon bei den einfachsten Dingen. Trainingshalber versuche ich meine eigene kleine Stringklasse zu schreiben und bei der Allokation von speicher passieren seltsame dinge:</p>
<p>Der Header:</p>
<pre><code class="language-cpp">class BOBString
	{
	public:
		BOBString(const char *str);
		~BOBString(void);

	private:
		char *str;
		int len;
	};
</code></pre>
<p>Und hier der Konstruktor der die Probleme macht:</p>
<pre><code class="language-cpp">BOBString::BOBString(const char *str)
	{
		//Länge des Parameterstrings herausfinden
		this-&gt;len = strlen(str);

		//Speicher für Klassenattribut str allokieren
		this-&gt;str = new char[this-&gt;len];

		//Pointer um über das Klassenattribut zu enumerieren
		char *targetPos = this-&gt;str;
		for(const char *sourcePos = str; *sourcePos; sourcePos++)
		{
			//SourcePos enumeriert über den Parameter str
			//char aus sourcePos in targetPos schreiben
			*targetPos = *sourcePos;
			targetPos++;
		}
	}
</code></pre>
<p>Und hier noch der Aufruf des Konstruktors:</p>
<pre><code class="language-cpp">INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, INT nCmdShow)
{
	BOBString str(&quot;Hallo&quot;);

    return 0;
}
</code></pre>
<p>In diesem Beispiel passiert folgendes:</p>
<p>this-&gt;len = 5<br />
und in der nächsten Zeile (this-&gt;str = new char[this-&gt;len];) ist<br />
this-&gt;str = ÍÍÍÍÍýýýý««««««««þîþîþîþ<br />
Was viel zu Lang ist, normalerweise sollte es nur ÍÍÍÍÍ sein.<br />
Nach der Schleife steht dann in this-&gt;str der Wert<br />
Halloýýýý««««««««þîþîþîþ</p>
<p>Wieso? Ich versuche das schon seit Tagen zu verstehen und verzweifle so langsam dran.<br />
Vielen Dank für jede Hilfe!</p>
<p>Gruß,<br />
Bob</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106203</guid><dc:creator><![CDATA[Serious_Bob]]></dc:creator><pubDate>Mon, 15 Aug 2011 07:13:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 07:16:23 GMT]]></title><description><![CDATA[<p>Tu dran denken, daß die Standard-Ausgabe für char* ausgibt bis zum Nullterminator. Du brauchst eine eigene Ausgabe.<br />
Auch der Debugger gibt bis zur '\0' am Ende aus oder wenigstens recht weit. Laß Dich von ihm nicht verhohnepiepeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106204</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 15 Aug 2011 07:16:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 07:23:06 GMT]]></title><description><![CDATA[<p>Schreibe doch die Funktion strlen(..) selbst, das hilft ev. für's Verständnis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106207</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Mon, 15 Aug 2011 07:23:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 07:31:55 GMT]]></title><description><![CDATA[<p>Serious_Bob schrieb:</p>
<blockquote>
<p>Wieso? Ich versuche das schon seit Tagen zu verstehen und verzweifle so langsam dran.</p>
</blockquote>
<p>Ich suche auch immer am länsgten an Fehlern, die keine sind.</p>
<p>ps: Dein Buch schätze ein auf ein relativ gutes der mittleren 90-er Jahre. Vielleicht tust Du Dir einen gefallen, etwas aktuelles zu holen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106212</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 15 Aug 2011 07:31:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 08:48:47 GMT]]></title><description><![CDATA[<p>Serious_Bob schrieb:</p>
<blockquote>
<p>Ich bringe mir zur Zeit C++ bei</p>
</blockquote>
<p>Schön. Was verwendest Du denn als Lehrmaterial?</p>
<p>Serious_Bob schrieb:</p>
<blockquote>
<p>Wieso? Ich versuche das schon seit Tagen zu verstehen und verzweifle so langsam dran.</p>
</blockquote>
<p>Du hast vergessen, Platz für einen Nullterminator zu machen und diesen mitzukopieren.</p>
<p>Darüber hinaus hast Du noch die Dreierregel verletzt. Das wird Dir als nächstes zum Verhängnis.</p>
<p>Sonst hast Du noch ein paar überflüssßge <code>void</code> s im Quellcode, die man heutzutage nicht mehr schreibt. Außerdem frage ich mich, warum Du eine Windows-spezifische main-Funktion verwendest. Das ist doch gar nicht nötig.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106241</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 15 Aug 2011 08:48:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 11:05:34 GMT]]></title><description><![CDATA[<p>Zuerstmal danke für die schnellen antworten <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>
<blockquote>
<p>u dran denken, daß die Standard-Ausgabe für char* ausgibt bis zum Nullterminator. Du brauchst eine eigene Ausgabe.<br />
Auch der Debugger gibt bis zur '\0' am Ende aus oder wenigstens recht weit. Laß Dich von ihm nicht verhohnepiepeln.</p>
</blockquote>
<p>Das war schon alles, ich wusste nicht, dass der Debugger so weit ließt, ich hänge also einfach noch eine '\0' hinten dran, jetzt zeigt der Debugger auch das richtige an. Danke dir!</p>
<blockquote>
<p>Schreibe doch die Funktion strlen(..) selbst, das hilft ev. für's Verständnis.</p>
</blockquote>
<p>Hab ich auch noch vor <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>
<blockquote>
<p>ps: Dein Buch schätze ein auf ein relativ gutes der mittleren 90-er Jahre. Vielleicht tust Du Dir einen gefallen, etwas aktuelles zu holen.</p>
</blockquote>
<p>Buch? <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="😃"
    /> Ne ich hab Kenntnisse in Java, C#, ABAP, PHP. Für C++ wollt ich mir nicht auch noch ein Buch kaufen <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 einzige Problem ist, dass C++ halt sehr Prozessor nah ist und ich da erstmal durchsteigen muss.</p>
<blockquote>
<p>arüber hinaus hast Du noch die Dreierregel verletzt. Das wird Dir als nächstes zum Verhängnis.<br />
Sonst hast Du noch ein paar überflüssßge voids im Quellcode, die man heutzutage nicht mehr schreibt. Außerdem frage ich mich, warum Du eine Windows-spezifische main-Funktion verwendest. Das ist doch gar nicht nötig.</p>
</blockquote>
<p>Die Klasse ist noch lange nicht fertig, aber danke für den Tipp!<br />
Das void im Destruktor ist auch nicht beabsichtigt gewesen, das ist noch vom Erstellen der Klasse übrig. Die Windows-spezifische main-Funktion wird später mal wichtig werden für mich.</p>
<p>Danke nochmal für alle Antworten.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106294</guid><dc:creator><![CDATA[Serious_Bob]]></dc:creator><pubDate>Mon, 15 Aug 2011 11:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 11:07:52 GMT]]></title><description><![CDATA[<blockquote>
<p>Das einzige Problem ist, dass C++ halt sehr Prozessor nah ist und ich da erstmal durchsteigen muss.</p>
</blockquote>
<p>Ist doch kein Problem. Ausserdem kann man mit C++ auch highlevel programmieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106295</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Mon, 15 Aug 2011 11:07:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 11:31:45 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Du hast vergessen, Platz für einen Nullterminator zu machen und diesen mitzukopieren.</p>
</blockquote>
<p>Der BOString hat eine Längenangabe und braucht keinen Nullterminator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106304</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 15 Aug 2011 11:31:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 11:39:23 GMT]]></title><description><![CDATA[<p>Buch macht kluch. Einfach mal &quot;Effektiv C++ programmieren&quot; durchlesen. Nur so zur Sicherheit, daß Du nicht gegen die Sprache programmierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106308</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 15 Aug 2011 11:39:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 12:07:57 GMT]]></title><description><![CDATA[<p>Serious_Bob schrieb:</p>
<blockquote>
<p>Das war schon alles, ich wusste nicht, dass der Debugger so weit ließt, ich hänge also einfach noch eine '\0' hinten dran, jetzt zeigt der Debugger auch das richtige an. Danke dir!</p>
</blockquote>
<p>Und das möchtest du jedes Mal machen? Verwende lieber das hier:</p>
<pre><code class="language-cpp">//Ein zusätzliches Zeichen für '\0':
this-&gt;len=strlen(str);
this-&gt;str=new char[this-&gt;len+sizeof(char)];

//Ist doch so viel lesbarer und einfacher, oder?
for(unsigned int i=0;str[i];i++)
    this-&gt;str[i]=str[i];
this-&gt;str[this-&gt;len]=0;
</code></pre>
<p>Serious_Bob schrieb:</p>
<blockquote>
<p>Das einzige Problem ist, dass C++ halt sehr Prozessor nah ist und ich da erstmal durchsteigen muss.</p>
</blockquote>
<p>Assembler ist sehr nahe am Prozessor, C++ ist nur maschinennah. Durch die hohe Abstraktion ist man in C++ in der Lage, Low-Level-Befehle mit einfachen Funktionen aufzurufen, die zudem plattformunabhängig sein können.</p>
<p>Serious_Bob schrieb:</p>
<blockquote>
<p>Die Klasse ist noch lange nicht fertig, aber danke für den Tipp!<br />
Das void im Destruktor ist auch nicht beabsichtigt gewesen, das ist noch vom Erstellen der Klasse übrig. Die Windows-spezifische main-Funktion wird später mal wichtig werden für mich.</p>
</blockquote>
<p>Eine Klasse ist eine Klasse, kein Programm. Und selbst, wenn der gesamte Quellcode in einer Klasse steckt, wird sie doch nicht zum Programm. Kapselung heißt das Zauberwort, und wenn ein Befehl in deiner Klasse Auswirkungen auf das Programm an sich (und nicht nur auf die Instanz) hat, solltest du das Design noch einmal überdenken - später kannst du dann mit deiner geschlossenen Klasse programmieren, ohne darüber nachdenken zu müssen, wie du was implementiert hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106322</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Mon, 15 Aug 2011 12:07:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 12:12:13 GMT]]></title><description><![CDATA[<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>Und das möchtest du jedes Mal machen? Verwende lieber das hier:</p>
<pre><code class="language-cpp">//Ein zusätzliches Zeichen für '\0':
this-&gt;len=strlen(str);
this-&gt;str=new char[this-&gt;len+sizeof(char)];

//Ist doch so viel lesbarer und einfacher, oder?
for(unsigned int i=0;str[i];i++)
    this-&gt;str[i]=str[i];
this-&gt;str[this-&gt;len]=0;
</code></pre>
</blockquote>
<p>Ihgittigitt.<br />
Nö, nicht so nachmachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106324</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 15 Aug 2011 12:12:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 12:26:31 GMT]]></title><description><![CDATA[<p>Verklärst du mir auch, warum, wieso und weshalb? <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="🤡"
    /> Nun gut, es mögen Leerzeichen fehlen, aber jeder hat nun mal seinen Stil ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106329</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Mon, 15 Aug 2011 12:26:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 12:29:05 GMT]]></title><description><![CDATA[<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<pre><code class="language-cpp">//Ein zusätzliches Zeichen für '\0':
this-&gt;len=strlen(str);
this-&gt;str=new char[this-&gt;len+sizeof(char)];

//Ist doch so viel lesbarer und einfacher, oder?
for(unsigned int i=0;str[i];i++)
    this-&gt;str[i]=str[i];
this-&gt;str[this-&gt;len]=0;
</code></pre>
</blockquote>
<p>Was daran lesbarer sein soll...?!<br />
sizeof(char) ist immer 1.</p>
<pre><code class="language-cpp">BOBString::BOBString(const char *str) {
    // FIXME: str auf NULL überprüfen, sonst kracht es.
    this-&gt;str = new char[this-&gt;len = std::stlren(str) + 1];
    std::strcpy(this-&gt;str, str);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2106332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106332</guid><dc:creator><![CDATA[sizeof char == 1]]></dc:creator><pubDate>Mon, 15 Aug 2011 12:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 12:37:04 GMT]]></title><description><![CDATA[<p>sizeof char == 1 schrieb:</p>
<blockquote>
<p>Was daran lesbarer sein soll...?!</p>
</blockquote>
<p>Für mich ist es nun mal lesbarer, find' dich damit ab. Jedes mal, wenn jemand</p>
<pre><code class="language-cpp">int * Pointer = new int [10];
</code></pre>
<p>schreibt, möchte ich gleichzeitig heulen und den Programmierer strangulieren.</p>
<pre><code class="language-cpp">BOBString::BOBString(const char *str) {
    // FIXME: str auf NULL überprüfen, sonst kracht es.
    this-&gt;str = new char[this-&gt;len = std::stlren(str) + 1];
    std::strcpy(this-&gt;str, str);
}
</code></pre>
<p>Das einzige, was mir (schon vorher, und zwar Sekunden vor deinem Post) aufgefallen ist, ist dass ich wohl <code>malloc</code> und <code>new</code> ein bisschen durcheinandergebracht habe (sizeof, was habe ich mir dabei gedacht ... :().</p>
<p>Zeiger auf NULL prüfen ist nicht nötig, bei <code>new</code> wird einfach eine <code>std::bad_alloc</code> -Exception geworfen. Mann, das habe ich mal voll ausgenutzt ... im <code>catch</code> -Block ein <code>goto</code> auf hinter <code>try</code> , und ich hatte blitzschnell 2 Gigabyte reservierten Speicher ... <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/2106336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106336</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Mon, 15 Aug 2011 12:37:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 12:47:33 GMT]]></title><description><![CDATA[<p>Und selbst, wenn sizeof(char)!=1 wäre, dann wäre</p>
<pre><code class="language-cpp">str=new char[this-&gt;len+sizeof(char)];
</code></pre>
<p>erst recht töricht, weil in [] die Anzahl steht und nicht die Größe in Bytes.</p>
<p>Aber mir scheint, Du wolltest damit rohen Speicher besorgen.<br />
Das macht man wiederum mit</p>
<pre><code class="language-cpp">str=::operator new(len+1);
</code></pre>
<p>Und wenn man schon strlen benutzt, darf's auch ein bißchen memcpy sein.</p>
<p>Lesbarer fände ich die Schleife mit str[i]!='\0'.</p>
<p>Die Schleife ist seltsam. Sie soll auf jeden Fall mindestens einen char kopieren? Der FI/AE würde das eine fußgesteuerte Schleife nennen. K&amp;R würden while(*dst++=*src++); schreiben. Irgendwie weigert sie sich, hübsch zu werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106343</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 15 Aug 2011 12:47:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 12:49:17 GMT]]></title><description><![CDATA[<p>Wieso wird denn hier ständig this verwendet, wo es nicht nötig ist? Es bläht den Code unnötig auf, und das empfinde ich persönlich als schlecht lesbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106345</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Mon, 15 Aug 2011 12:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 12:51:35 GMT]]></title><description><![CDATA[<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>Jedes mal, wenn jemand</p>
<pre><code class="language-cpp">int * Pointer = new int [10];
</code></pre>
<p>schreibt, möchte ich gleichzeitig heulen und den Programmierer strangulieren.</p>
</blockquote>
<p>Geht mir ähnlich. Aber waagerecht noch nicht so schlimm.<br />
Es gibt Leute, die machen es senkrecht!</p>
<pre><code class="language-cpp">this-&gt;len=strlen(str);

this-&gt;str=new char[this-&gt;len+sizeof(char)];

//Ist doch so viel lesbarer und einfacher, oder?
for(unsigned int i=0;str[i];i++)
    this-&gt;str[i]=str[i];

this-&gt;str[this-&gt;len]=0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2106348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106348</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 15 Aug 2011 12:51:35 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 12:52:14 GMT]]></title><description><![CDATA[<p>Serious_Bob schrieb:</p>
<blockquote>
<p>Buch? <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="😃"
    /> Ne ich hab Kenntnisse in Java, C#, ABAP, PHP.<br />
Für C++ wollt ich mir nicht auch noch ein Buch kaufen <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>Ich sehe da keinen Zusammenhang. C++ ist eine völlig andere Sprache. Du tust so, als ob C++ nur ein Dialekt von anderen Dir bekannten Sprachen sei. Da irrst Du Dich aber gewaltig. Du kannst Dir mit einem <em>guten</em> C++ Buch viel Ärger und Zeit sparen. Zeit ist Geld. Glaub's mir, die Investition lohnt sich.</p>
<p><strong>Kompakte</strong> Grundausbilding:<br />
- Accelerated C++ (Andrew Koenig &amp; Barbara E. Moo)<br />
- Effective C++ (Scott Meyers)</p>
<p>Serious_Bob schrieb:</p>
<blockquote>
<p>Das einzige Problem ist, dass C++ halt sehr Prozessor nah ist und ich da erstmal durchsteigen muss.</p>
</blockquote>
<p>In C++ kannst Du Dir die Füße abschießen, ja. Umso wichtiger sind gute Bücher, die Dir die Konzepte der Sprache und bewährte Vorgehensweisen näher bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106349</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 15 Aug 2011 12:52:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 13:00:39 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Aber mir scheint, Du wolltest damit rohen Speicher besorgen.</p>
</blockquote>
<p>Ja, ich habe bereits gesagt, dass ich da Unsinn geschrieben habe. Ich gebe es zu.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Und wenn man schon strlen benutzt, darf's auch ein bißchen memcpy sein.</p>
</blockquote>
<p>Hätte ich auch gleich tun können, dafür war ich aber schlichtweg zu faul.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Die Schleife ist seltsam. Sie soll auf jeden Fall mindestens einen char kopieren? Der FI/AE würde das eine fußgesteuerte Schleife nennen. K&amp;R würden while(*dst++=*src++); schreiben. Irgendwie weigert sie sich, hübsch zu werden.</p>
</blockquote>
<p><code>str[i]</code> bedeutet, dass überprüft wird, ob in dem jeweiligen Element ein Nullterminierungszeichen steht. Wenn ja, wird die Schleife abgebrochen, und deshalb wird bei einem leeren String auch nur die 0 eingefügt. Die Anführungszeichen und den Schrägstrich spare ich mir, weil <code>'\0'</code> soweit ich weiß äquivalent zu 0 ist. Insofern würde ich (ohne weitere Kenntnisse darüber, wie hinterher der Maschinencode aussieht) sagen, dass die Schleife ihren Zweck sehr performant erfüllt, oder?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16702">@_matze</a>: Ein Parameter von ihm heißt 'str', genauso wie ein Element. Ich hätte es auch rausnehmen können (und glaub' mir, ich war kurz davor), aber dann hat mich wieder die Faulheit übermannt.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Geht mir ähnlich. Aber waagerecht noch nicht so schlimm.<br />
Es gibt Leute, die machen es senkrecht!</p>
</blockquote>
<p>Hat auch was von psychischer Folter, zumindest, wenn man Zwangsneurotiker ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106353</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Mon, 15 Aug 2011 13:00:39 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 13:11:55 GMT]]></title><description><![CDATA[<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16702">@_matze</a>: Ein Parameter von ihm heißt 'str', genauso wie ein Element. Ich hätte es auch rausnehmen können (und glaub' mir, ich war kurz davor), aber dann hat mich wieder die Faulheit übermannt.</p>
</blockquote>
<p>Das ist mir schon aufgefallen. Ich habe aber nach den Stellen gefragt, an denen this <em>unnötigerweise</em> verwendet wird. Und wenn man konsistent bleiben will, ist es wohl ratsamer, Member oder Parameter umzubenennen, anstatt an ausnahmslos jeder Stelle &quot;this-&gt;&quot; zu notieren. Das ist dann letzten Endes auch weniger Arbeit, also der Faulheit zuträglich. <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/2106357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106357</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Mon, 15 Aug 2011 13:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 13:46:11 GMT]]></title><description><![CDATA[<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p><code>str[i]</code> bedeutet, dass überprüft wird, ob in dem jeweiligen Element ein Nullterminierungszeichen steht. Wenn ja, wird die Schleife abgebrochen, und deshalb wird bei einem leeren String auch nur die 0 eingefügt. Die Anführungszeichen und den Schrägstrich spare ich mir, weil <code>'\0'</code> soweit ich weiß äquivalent zu 0 ist. Insofern würde ich (ohne weitere Kenntnisse darüber, wie hinterher der Maschinencode aussieht) sagen, dass die Schleife ihren Zweck sehr performant erfüllt, oder?</p>
</blockquote>
<p>Nicht performanter also mit dem Vergleich gegen den Nullterminator.<br />
Du läufst, solange str[i] wahr ist.<br />
Ich laufe, solange str[i] nicht der Nullterminator ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106384</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 15 Aug 2011 13:46:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 14:03:22 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Nicht performanter also mit dem Vergleich gegen den Nullterminator.<br />
Du läufst, solange str[i] wahr ist.<br />
Ich laufe, solange str[i] nicht der Nullterminator ist.</p>
</blockquote>
<p>Und sofern mich meine kümmerlichen C/C++-Kenntnisse nicht trügen, ist <code>wahr == (!Nullterminator)</code> , oder? Der Nullterminator enthält ja den Wert 0, und der ist negativ, während jedes andere Zeichen positiv ist (zumindest, sofern mich mein Wissen um ASCII, den verschiedenen Codepages und den Unicode-Formaten nicht auf das Glatteis führen). Daher verstehe ich nicht ganz, was du mir sagen willst ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106393</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Mon, 15 Aug 2011 14:03:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 14:08:11 GMT]]></title><description><![CDATA[<p>Der aus dem Westen ... schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Nicht performanter also mit dem Vergleich gegen den Nullterminator.<br />
Du läufst, solange str[i] wahr ist.<br />
Ich laufe, solange str[i] nicht der Nullterminator ist.</p>
</blockquote>
<p>Und sofern mich meine kümmerlichen C/C++-Kenntnisse nicht trügen, ist <code>wahr == (!Nullterminator)</code> , oder? Der Nullterminator enthält ja den Wert 0, und der ist negativ, während jedes andere Zeichen positiv ist (zumindest, sofern mich mein Wissen um ASCII, den verschiedenen Codepages und den Unicode-Formaten nicht auf das Glatteis führen). Daher verstehe ich nicht ganz, was du mir sagen willst ...</p>
</blockquote>
<p>Ich finde, daß meine Schreibweise eher Klartext ist, während Deine ein kleines Rätsel beinhaltet. Rätsel im Code sind böse meist. Es geht nicht darum, zu zeigen, daß man so vertraut mit C++ ist, daß man sowas normalerweise recht flüssig hinschreiben kann (das können wir alle). Es geht darum, daß man den Code auch noch stockbesoffen recht flüssig lesen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106395</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 15 Aug 2011 14:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 15:42:42 GMT]]></title><description><![CDATA[<p>Was mich immer noch wundert ist, dass es auf 3 Seiten keiner geschafft hat, die Initialisierungsliste ins Spiel zu bringen?</p>
<pre><code class="language-cpp">class BOBString 
    { 
    public: 
        BOBString(const char *str); 
        ~BOBString(void); 

    private: 
        int len; // die Reihenfolge hab ich umgedreht,
        char *str; // sonst serviert einem der Compiler eine Warnung
    };

BOBString::BOBString(const char* str) : len(std::strlen(str)), str(new char[len + 1])
{
  // String kopieren
  // ...
}
</code></pre>
<p>Wo ich mir jetzt nicht sicher bin, ob strlen() für Null-Zeiger so funktioniert, dass 0 zurückgegeben wird, aber da kann man ja schnell mit ?: Abhilfe schaffen. <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/2106436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106436</guid><dc:creator><![CDATA[bmario]]></dc:creator><pubDate>Mon, 15 Aug 2011 15:42:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit malloc und new on Mon, 15 Aug 2011 15:55:48 GMT]]></title><description><![CDATA[<p>bmario schrieb:</p>
<blockquote>
<p>Wo ich mir jetzt nicht sicher bin, ob strlen() für Null-Zeiger so funktioniert, dass 0 zurückgegeben wird, aber da kann man ja schnell mit ?: Abhilfe schaffen. <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>Wozu? Wer 0 übergibt, ist selber schuld. Fertig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2106441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2106441</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 15 Aug 2011 15:55:48 GMT</pubDate></item></channel></rss>