<?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[Copy ctor von wstring mit wchar frage]]></title><description><![CDATA[<p>Ich benutze die XML Serialisierungsklasse xmlser, dort gyibt es eine Methode , welche mir wstrings aussliest, deren Signatur sieht so aus:</p>
<pre><code class="language-cpp">typedef wchar_t UCSChar;
bool XmlReader::getString(UCSChar* xpath, UCSChar* str);
</code></pre>
<p>Ich würde gerne std::wstring zur Verwaltung benutzen, allerdings habe ich Problem, folgendes klappt natürlich nicht:</p>
<pre><code class="language-cpp">void readXml(XmlReader&amp; rs)
{
	std::wstring wname;
	rs.getString(L&quot;/Config/name&quot;,wname);
}
</code></pre>
<p>Dies hingegen klappt schon:</p>
<pre><code class="language-cpp">std::wstring name;
void readXml(XmlReader&amp; rs)
	{
		UCSChar * wname = new UCSChar();
		rs.getString(L&quot;/Config/name&quot;,wname);
		name = std::wstring(wname);
		//delete wname;
	}
</code></pre>
<p>Wie man sieht ist delete wname; auskommentiert. Wenn ich es unkommentiere, bekomme ich eine heap corruption.<br />
Kann mir jemand erklären wieso? Ich dachte name = std::wstring(wname); kopiert den Inhalt und ich kann wname getrost löschen...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/229343/copy-ctor-von-wstring-mit-wchar-frage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 22:45:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/229343.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Dec 2008 14:38:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Copy ctor von wstring mit wchar frage on Wed, 10 Dec 2008 14:38:10 GMT]]></title><description><![CDATA[<p>Ich benutze die XML Serialisierungsklasse xmlser, dort gyibt es eine Methode , welche mir wstrings aussliest, deren Signatur sieht so aus:</p>
<pre><code class="language-cpp">typedef wchar_t UCSChar;
bool XmlReader::getString(UCSChar* xpath, UCSChar* str);
</code></pre>
<p>Ich würde gerne std::wstring zur Verwaltung benutzen, allerdings habe ich Problem, folgendes klappt natürlich nicht:</p>
<pre><code class="language-cpp">void readXml(XmlReader&amp; rs)
{
	std::wstring wname;
	rs.getString(L&quot;/Config/name&quot;,wname);
}
</code></pre>
<p>Dies hingegen klappt schon:</p>
<pre><code class="language-cpp">std::wstring name;
void readXml(XmlReader&amp; rs)
	{
		UCSChar * wname = new UCSChar();
		rs.getString(L&quot;/Config/name&quot;,wname);
		name = std::wstring(wname);
		//delete wname;
	}
</code></pre>
<p>Wie man sieht ist delete wname; auskommentiert. Wenn ich es unkommentiere, bekomme ich eine heap corruption.<br />
Kann mir jemand erklären wieso? Ich dachte name = std::wstring(wname); kopiert den Inhalt und ich kann wname getrost löschen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1628289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1628289</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Wed, 10 Dec 2008 14:38:10 GMT</pubDate></item><item><title><![CDATA[Reply to Copy ctor von wstring mit wchar frage on Wed, 10 Dec 2008 14:54:09 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Kann mir jemand erklären wieso? Ich dachte name = std::wstring(wname); kopiert den Inhalt und ich kann wname getrost löschen...</p>
</blockquote>
<p>Naja, das Problem ist eher, dass dein Array nicht gross genug ist, bzw. dass du genau nur ein <code>wchar_t</code> auf dem Heap anlegst. Also Speicher für genau ein einziges Zeichen.</p>
<p>In der Bibliothek wird es wohl irgendwo eine Möglichkeit haben, wo du rausfinden kannst, wieviele Zeichen an der Stelle sind. Ein dementsprechend langes Array musst du dann anlegen und der Funktion übergeben. Zudem musst du nachprüfen, ob das Array von der Funktion auch nullterminiert wird. Dann kannst du es an den Konstruktor von <code>std::wstring</code> übergeben.</p>
<p>Du könntest übrigens auch statt eines C-Arrays einen <code>std::vector&lt;wchar_t&gt;</code> nehmen oder ein <code>boost::scoped_array&lt;wchar_t&gt;</code> .</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1628303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1628303</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 10 Dec 2008 14:54:09 GMT</pubDate></item><item><title><![CDATA[Reply to Copy ctor von wstring mit wchar frage on Thu, 11 Dec 2008 07:36:34 GMT]]></title><description><![CDATA[<p>Hi, danke für die Antwort.<br />
Sieht im moment nach blinder allokation aus, was? Ich alloziiere soviel Speicher wie ich für ratsam finde und hoffe, dass es ausreicht?</p>
<p>Die Signatur der Methode kann ich nicht ändern, die muss nen UCSChar * nehmen und nimmt mir sicher übel, wenn ich da n vektor reinklatsche <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1628617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1628617</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Thu, 11 Dec 2008 07:36:34 GMT</pubDate></item><item><title><![CDATA[Reply to Copy ctor von wstring mit wchar frage on Thu, 11 Dec 2008 07:43:04 GMT]]></title><description><![CDATA[<p>Eine Xml-Bibliothek, die keine Möglichkeit bietet, vorher die Länge der Daten in Erfahrung zu bringen? O.O</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1628619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1628619</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 11 Dec 2008 07:43:04 GMT</pubDate></item><item><title><![CDATA[Reply to Copy ctor von wstring mit wchar frage on Thu, 11 Dec 2008 13:38:22 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Hi, danke für die Antwort.<br />
Sieht im moment nach blinder allokation aus, was? Ich alloziiere soviel Speicher wie ich für ratsam finde und hoffe, dass es ausreicht?</p>
</blockquote>
<p>Nein, du sollst die Dokumentation der Bibliothek lesen oder am besten das Testprojekt anschauen, dann findest du raus, wie man sowas macht, nämlich so:</p>
<pre><code class="language-cpp">void readXml(XmlReader&amp; rs)
{
    int length = rs.getStringLength(L&quot;/Config/name&quot;);
    UCSChar* wname = new UCSChar[length]
    rs.getString(L&quot;/Config/name&quot;,wname);
    name = std::wstring(wname);
    delete[] wname;
}
</code></pre>
<p>Seikilos schrieb:</p>
<blockquote>
<p>Die Signatur der Methode kann ich nicht ändern, die muss nen UCSChar * nehmen und nimmt mir sicher übel, wenn ich da n vektor reinklatsche <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>Du musst auch nichts an der Signatur ändern, ich zeig dir mal die zwei Lösungen:</p>
<pre><code class="language-cpp">#include &lt;boost/scoped_array.hpp&gt;

// ...

void readXml(XmlReader&amp; rs)
{
    int length = rs.getStringLength(L&quot;/Config/name&quot;);
    boost::scoped_array&lt;UCSChar&gt; wname
        = boost::scoped_array&lt;UCSChar&gt;(new UCSChar[length]);

    rs.getString(L&quot;/Config/name&quot;, wname.get());
    name = std::wstring(wname.get());
}
</code></pre>
<pre><code class="language-cpp">#include &lt;vector&gt;

// ...

void readXml(XmlReader&amp; rs)
{
    static std::vector&lt;UCSChar&gt; buffer;

    int length = rs.getStringLength(L&quot;/Config/name&quot;);
    buffer.resize(length);

    rs.getString(L&quot;/Config/name&quot;, &amp;buffer[0]);
    name = std::wstring(buffer.begin(), buffer.end());
    // oder
    name = std::wstring(&amp;buffer[0]);
}
</code></pre>
<p>(Nicht getestet)</p>
<p>Die zweite Lösung hat einige Vorteile. Sie ist zwar nicht Multithreading tauglich, aber dafür gibt sie den Puffer niemals auf. Es wird immer wieder der gleiche Puffer verwendet und er muss daher nie neu alloziert werden, ausser es wird ein grösserer Puffer benötigt. Aber auch da muss nicht unbedingt neu alloziert werden, da der <code>std::vector</code> meistens schon mehr Speicher alloziert, als nötig ist.</p>
<p>Auch praktisch ist bei beiden Lösungen, dass die Speicherfreigabe automatisiert wird. So können auch gefahrlos Exceptions geworfen werden, ohne das irgendwelche Speicherlecks entstehen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1628859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1628859</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 11 Dec 2008 13:38:22 GMT</pubDate></item><item><title><![CDATA[Reply to Copy ctor von wstring mit wchar frage on Thu, 11 Dec 2008 13:47:26 GMT]]></title><description><![CDATA[<p>Interessant, danke für die Infos.<br />
Ich musste die Lib sowieso stark modifizieren, die const correctness geht hier mal garnicht wenn ein UCSChar * genommen wird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1628864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1628864</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Thu, 11 Dec 2008 13:47:26 GMT</pubDate></item><item><title><![CDATA[Reply to Copy ctor von wstring mit wchar frage on Thu, 11 Dec 2008 13:51:29 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Interessant, danke für die Infos.<br />
Ich musste die Lib sowieso stark modifizieren, die const correctness geht hier mal garnicht wenn ein UCSChar * genommen wird</p>
</blockquote>
<p>Bist du denn gezwungen diese Bibliothek zu benutzen? Gibt schliesslich auch noch andere XML Bibliotheken, auch kleine.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1628866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1628866</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 11 Dec 2008 13:51:29 GMT</pubDate></item><item><title><![CDATA[Reply to Copy ctor von wstring mit wchar frage on Thu, 11 Dec 2008 14:14:05 GMT]]></title><description><![CDATA[<p>Naja der wechsel würde den aufwand nicht lohnen, wenn anforderungen steigen, werd ich wohl auf tinyxml umsteigen.<br />
Was mich stört, ist dass ich das serialisieren selber schreiben muss, das geht in C# aber besser <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/1628884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1628884</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Thu, 11 Dec 2008 14:14:05 GMT</pubDate></item><item><title><![CDATA[Reply to Copy ctor von wstring mit wchar frage on Thu, 11 Dec 2008 14:29:22 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Was mich stört, ist dass ich das serialisieren selber schreiben muss, das geht in C# aber besser <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>
</blockquote>
<p>Wenn man der Jungspund (C#) ist, und die Fehler der älteren Generationen (C++/Java/VB/Delphi) kennt, kann man sie umgehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1628895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1628895</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 11 Dec 2008 14:29:22 GMT</pubDate></item></channel></rss>