<?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[Eigene Stringklasse, char* dynamisch vergrößern]]></title><description><![CDATA[<p>Guten Tag,</p>
<p>ich versuche gerade eine eigene Stringklasse zu implementieren. Dafür habe ich eine Objektvariable private:char* str;. Bei meinem Konstruktor möchte ich nun str dynamisch verändern, sodass es x groß wird.</p>
<pre><code>Str::Str(char const* s){

	int len = 0;
	for (len;s[len]!= 0;len++);

	str = (char*) realloc(str,len*sizeof(char));

	for(int i=0;i&lt;len;i++){
		str[i]=s[i]; 
	}
}
</code></pre>
<p>Habe vorher versucht len mit sizeof(s)/sizeof(char) zu ermitteln, dabei kam leider Quatsch bei raus, die len jetzt gibt jedenfalls eine richtige Länge an.<br />
Dazu habe ich realloc gefunden, leider scheint es noch nicht ganz richtig zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325274/eigene-stringklasse-char-dynamisch-vergrößern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 03:29:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325274.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Apr 2014 18:21:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 18:24:26 GMT]]></title><description><![CDATA[<p>Guten Tag,</p>
<p>ich versuche gerade eine eigene Stringklasse zu implementieren. Dafür habe ich eine Objektvariable private:char* str;. Bei meinem Konstruktor möchte ich nun str dynamisch verändern, sodass es x groß wird.</p>
<pre><code>Str::Str(char const* s){

	int len = 0;
	for (len;s[len]!= 0;len++);

	str = (char*) realloc(str,len*sizeof(char));

	for(int i=0;i&lt;len;i++){
		str[i]=s[i]; 
	}
}
</code></pre>
<p>Habe vorher versucht len mit sizeof(s)/sizeof(char) zu ermitteln, dabei kam leider Quatsch bei raus, die len jetzt gibt jedenfalls eine richtige Länge an.<br />
Dazu habe ich realloc gefunden, leider scheint es noch nicht ganz richtig zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396004</guid><dc:creator><![CDATA[Rawr Tiger]]></dc:creator><pubDate>Wed, 23 Apr 2014 18:24:26 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 18:31:40 GMT]]></title><description><![CDATA[<p>realloc versucht die Größe eines bereits allokierten Speicherbereichs zu vergrößern. In deinem Code zeigt jedoch str ins Nirvana weil es nicht initialisiert wurde. Das sollte ab und zu zum Absturz führen.<br />
Für Längen von C-Strings gibt es strlen und zum kopieren strcpy obwohl in deinem Fall eher memcpy angesagt wäre. Ach was rede ich, std::copy. Nicht so viel die bösen C-Funktionen benutzen. std:string speichert die Größe, vielleicht willst du das auch machen. Außerdem solltest du dir überlegen, ob du nicht new[] und delete[] statt malloc, realloc und free benutzen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396010</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Wed, 23 Apr 2014 18:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 18:36:31 GMT]]></title><description><![CDATA[<p>Schon einmal die Dokumentation von realloc gelesen? Welchen Wert hat denn str, wenn du es an realloc uebergibst?</p>
<p>Ich hoffe, ich habe jetzt deine Frage beantwortet, denn</p>
<blockquote>
<p>leider scheint es noch nicht ganz richtig zu sein.</p>
</blockquote>
<p>ist keine brauchbare Fehlerbeschreibung. Ich kann mir noch zig andere Dinge vorstellen, die du falsch gemacht haben koenntest (manuelle Speicherverwaltung ist recht fehleranfaellig und du scheinst es das erste Mal zu machen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396013</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 23 Apr 2014 18:36:31 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 18:50:32 GMT]]></title><description><![CDATA[<p>Gibt es irgendeinen Grund nicht <code>std::vector</code> zu benutzen?</p>
<pre><code class="language-cpp">private: std::vector&lt;char&gt; str;
//...
Str::Str(char const* s) : str(s, s + std::strlen(s) + 1) {}
</code></pre>
<p>Wenn es nicht <code>vector</code> sein soll, wäre die nächste Wahl <code>unique_ptr</code> .</p>
<pre><code class="language-cpp">private:
  std::unique_ptr&lt;char[]&gt; str;
  std::size_t size;
//...
Str::Str(char const* s) : Str(s, s + std::strlen(s)) {}
//...
Str::Str(char const *begin, char const *end) : size(std::distance(begin, end)) {
  str.reset(new char[size + 1]); //ein Byte mehr für Nullterminierung
  std::copy(begin, end, str.get());
  str.get()[size] = '\0'; //Nullterminierung für .c_str(), das du wahrscheinlich haben möchtest
}

Str::~Str() {
  //nichts, denn das Freigeben macht unique_ptr für dich (wie vector es auch täte)
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2396014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396014</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 23 Apr 2014 18:50:32 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 19:09:26 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Gibt es irgendeinen Grund nicht <code>std::vector</code> zu benutzen?</p>
</blockquote>
<p>Ein string kann durchaus recht andere Anforderungen an die Allokationsstrategie haben, als ein std::vector. Darum ist in der Standardbibliothek ein std::string intern auch kein std::vector. Zumindest bei den ueblichen Implementierungen. Ein std::vector wuerde durchaus die Anforderungen an std::string erfuellen, std::string-Implementierungen sind in der Regel trotzdem anders, weil die Anforderungen an std::string (bewusst!) nicht so restriktiv sind wie an std::vector. (Vermutlich hat der TE aber nicht so weit gedacht <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>
<p>Ob der std::string selber die Aufgabe hat, die Ressourcen zu verwalten oder ob er dies an eine Unterklasse auslagern sollte, darueber laesst sich sicherlich streiten. Der string ist meiner Meinung nach ein Grenzfall zwischen Ressourcenverwalter und einer Klasse, bei der es eher um die sonstige Funktionalitaet geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396018</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 23 Apr 2014 19:09:26 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 19:13:31 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ein std::vector wuerde durchaus die Anforderungen an std::string erfuellen, std::string-Implementierungen sind in der Regel trotzdem anders, weil die Anforderungen an std::string (bewusst!) nicht so restriktiv sind wie an std::vector.</p>
</blockquote>
<p>Welche Anforderung zum Beispiel?</p>
<p>Umgekehrt erfüllt vector übrigens nicht die Bedingungen für string, weil der Nullterminator fehlt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396020</guid><dc:creator><![CDATA[enable_if&amp;lt;c++11&amp;gt;]]></dc:creator><pubDate>Wed, 23 Apr 2014 19:13:31 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 19:17:41 GMT]]></title><description><![CDATA[<p>Ok, swap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396022</guid><dc:creator><![CDATA[enable_if&amp;lt;c++11&amp;gt;]]></dc:creator><pubDate>Wed, 23 Apr 2014 19:17:41 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 19:26:43 GMT]]></title><description><![CDATA[<p>enable_if&lt;c++11&gt; schrieb:</p>
<blockquote>
<p>Ok, swap.</p>
</blockquote>
<p>Genau. Vor C++11 gab's noch mehr Unterschiede, z.B. wann ein Iterator ungueltig werden darf (bei string gab's da mehr Faelle). Diese wurden aber ebenfalls bewusst entfernt, da sie im alten Standard waren, um die Copy-on-Write-Optimierung zu ermoeglichen. Diese Optimierung ist jedoch in Ungnade gefallen, weshalb man den Standard umformuliert hat, um sie nicht mehr zu ermoeglichen.<br />
Der Unterschied beim swap erlaubt es einem std::string beispielsweise, eine short-string-Optimierung einzusetzen, etwas, dass ein std::vector nicht kann.</p>
<p>enable_if&lt;c++11&gt; schrieb:</p>
<blockquote>
<p>Umgekehrt erfüllt vector übrigens nicht die Bedingungen für string, weil der Nullterminator fehlt.</p>
</blockquote>
<p>Das ist keine allgemeine Anforderung an die Eigenschaften eines std::string (der muss nicht nullterminiert sein), sondern an std::string::c_str(), welche ein vector ohnehin nicht hat. Ein String auf Basis von vector muesste diese Methode ohnehin neu implementieren und kann dann ein Nullzeichen anhaengen (oder einfach staendig ein Nullzeichen am Ende halten).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396025</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 23 Apr 2014 19:26:43 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 19:33:07 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>enable_if&lt;c++11&gt; schrieb:</p>
<blockquote>
<p>Umgekehrt erfüllt vector übrigens nicht die Bedingungen für string, weil der Nullterminator fehlt.</p>
</blockquote>
<p>Das ist keine allgemeine Anforderung an die Eigenschaften eines std::string (der muss nicht nullterminiert sein), sondern an std::string::c_str(), welche ein vector ohnehin nicht hat. Ein String auf Basis von vector muesste diese Methode ohnehin neu implementieren und kann dann ein Nullzeichen anhaengen (oder einfach staendig ein Nullzeichen am Ende halten).</p>
</blockquote>
<p>s.c_str()==s.data() und c_str noexcept und invalidiert keine Iteratoren, daher müssen alle anderen Methoden das Nullzeichen entweder reinschreiben oder Speicher dafür reservieren. Ein String auf Basis von vector müsste daher fast alle Methoden neu implementieren, nicht nur c_str.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396026</guid><dc:creator><![CDATA[enable_if&amp;lt;c++11&amp;gt;]]></dc:creator><pubDate>Wed, 23 Apr 2014 19:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 19:45:03 GMT]]></title><description><![CDATA[<blockquote>
<p>der muss nicht nullterminiert sein</p>
</blockquote>
<p>Doch. <code>str[str.size()] == 0</code> , und zwar immer. Außerdem zeigt <code>data()</code> / <code>c_str()</code> direkt auf das interne Array. (Seit C++11, siehe §21.4.7.1 und §21.4.5)</p>
<blockquote>
<p>sondern an std::string::c_str(), welche ein vector ohnehin nicht hat.</p>
</blockquote>
<p>Nein, aber ein vector hat <code>data()</code> , und das ist dann verschieden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396028</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 23 Apr 2014 19:45:03 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 19:53:47 GMT]]></title><description><![CDATA[<p>Und was aendert das? Man muss ohnehin neue Methoden schreiben, auch neue Konstruktoren. Die fuegen dann eine Null am Ende ein. Das aendert nichts da dran, dass man eine std::string absolut standardkonform mit einem std::vector als internen Ressourcenhalter implementieren koennte. Dem vector vorzuwerfen, dass er keine automatische Nullterminierung einfuegt ist, wie ihm vorzuwerfen, dass er kein substr oder keinen operator&lt;= anbietet. Das geht voellig am Punkt der Speicherverwaltung vorbei sondern ist Funkionalitaet der Stringklasse und muss von dieser implementiert werden.</p>
<p>Umgekehrt ist es unmoeglich, einen vector intern irgendwie mit einem std::string zu implementieren (ueber irgendwelche wilden reinterpret_casts und placements news), da der string nicht die Anforderungen an vector::swap erfuellen kann.</p>
<p>(Irgendwelche Custom-Allocators lasse ich bei der Diskussion mal aussen vor. Wir reden hier von der normalen Verwendungsweise, bei denen sowohl vector als auch string letztendlich irgendwie ein malloc/new benutzen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396031</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 23 Apr 2014 19:53:47 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 20:00:39 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Umgekehrt ist es unmoeglich, einen vector intern irgendwie mit einem std::string zu implementieren (ueber irgendwelche wilden reinterpret_casts und placements news), da der string nicht die Anforderungen an vector::swap erfuellen kann.</p>
</blockquote>
<p>Mit unique_ptr&lt;string&gt; trivial möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396034</guid><dc:creator><![CDATA[enable_if&amp;lt;c++11&amp;gt;]]></dc:creator><pubDate>Wed, 23 Apr 2014 20:00:39 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Stringklasse, char* dynamisch vergrößern on Wed, 23 Apr 2014 20:04:36 GMT]]></title><description><![CDATA[<p>Man kann sowieso nicht <code>vector</code> über <code>basic_string</code> implementieren, weil <code>basic_string</code> nur PODs halten kann (die kein Array sind). Solche Typen sind in Standardklausel 21 als <em>char-like</em> Typen beschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396036</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 23 Apr 2014 20:04:36 GMT</pubDate></item></channel></rss>