<?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[speicherzugriffsfehler bei map destruktion]]></title><description><![CDATA[<p>ich habe ein ziemliches problem mit dem folgenden code-schnipsel</p>
<p>ich will einen baum aufbauen, und die nodes sollen möglichst klein werden,<br />
aber jeder node soll einen name haben, also dachte ich mir :<br />
ich speicher pointer zu den namen (deren anzahl ist nämlich ziemlich begrenzt)<br />
in einer map&lt;name, std::string *&gt;<br />
so kann ich schnell den pointer zum namen finden</p>
<p>die erste funktion soll einen namen hinzufügen<br />
die 2. ist der dtor<br />
(std::map elemente muss man eigenlich nicht löschen, aber ohne gehts auch nicht)</p>
<p>sieht wer den fehler?</p>
<pre><code class="language-cpp">const std::string * const HMM_Tree::insertNodeName(const std::string&amp; name)
{
std::map&lt;std::string, std::string * &gt;::const_iterator it = m_node_names.find(name);
if(it != m_node_names.end()) return it-&gt;second;
// else
std::string * new_name = new std::string(name);
m_node_names[name] = new_name;
return new_name;
}

HMM_Tree::~HMM_Tree()
{
// delete the names
typedef std::map&lt;std::string, std::string * &gt;::iterator name_map_it;
for(name_map_it it = m_node_names.begin(); it != m_node_names.end(); ++it)
  {
  delete it-&gt;second;
  it-&gt;second = 0;
  }
}
</code></pre>
<p>anbei noch die valgrind ausgabe</p>
<blockquote>
<p>==13051== Conditional jump or move depends on uninitialised value(s)<br />
==13051== at 0x805316E: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:46)<br />
==13051== by 0x804F6B7: Hybrid_HMM_Tests() (hybrid_hmm_test.hpp:10)<br />
==13051== by 0x804F706: main (short_test.cpp:8)<br />
==13051==<br />
==13051== Use of uninitialised value of size 4<br />
==13051== at 0x8053106: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:48)<br />
==13051== by 0x804F6B7: Hybrid_HMM_Tests() (hybrid_hmm_test.hpp:10)<br />
==13051== by 0x804F706: main (short_test.cpp:8)<br />
==13051==<br />
==13051== Invalid read of size 4<br />
==13051== at 0x40AFDFB: std::string::~string() (in /usr/lib/gcc/i686-pc-linux-gnu/4.2.2/libstdc++.so.6.0.9)<br />
==13051== by 0x805311C: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:48)<br />
==13051== by 0x804F6B7: Hybrid_HMM_Tests() (hybrid_hmm_test.hpp:10)<br />
==13051== by 0x804F706: main (short_test.cpp:8)<br />
==13051== Address 0xe8240485 is not stack'd, malloc'd or (recently) free'd<br />
==13051==<br />
==13051== Process terminating with default action of signal 11 (SIGSEGV)<br />
==13051== Access not within mapped region at address 0xE8240485<br />
==13051== at 0x40AFDFB: std::string::~string() (in /usr/lib/gcc/i686-pc-linux-gnu/4.2.2/libstdc++.so.6.0.9)<br />
==13051== by 0x805311C: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:48)<br />
==13051== by 0x804F6B7: Hybrid_HMM_Tests() (hybrid_hmm_test.hpp:10)<br />
==13051== by 0x804F706: main (short_test.cpp:8)</p>
</blockquote>
<p>das mit der map von strings kommt mir selber ein wenig komisch vor, aber ich<br />
muss die späteren nodes halt so klein wie möglich halten, und sone map<br />
kam mir am besten vor, um schnell von nem string zu nen ptr auf string zu kommen</p>
<p>[edit]<br />
==13051== by 0x805311C: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:48)<br />
is dann diese zeile :</p>
<pre><code class="language-cpp">delete it-&gt;second;
</code></pre>
<p>was ich aber nicht verstehe, denn der ptr müsste doch wegen</p>
<pre><code class="language-cpp">std::string * new_name = new std::string(name);
m_node_names[name] = new_name;
</code></pre>
<p>valid sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>wenn ich den ganzen dtor auskommentiere kommt so sowas :</p>
<blockquote>
<p>==13628== Conditional jump or move depends on uninitialised value(s)<br />
==13628== at 0x8054025: std::_Rb_tree&lt;std::string, std::pair&lt;std::string const, std::string*&gt;, std::_Select1st&lt;std::pair&lt;std::string const, std::string*&gt; &gt;, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator&lt;std::pair&lt;std::string const, std::string*&gt; &gt; &gt;::_M_erase(std::_Rb_tree_node&lt;std::pair&lt;std::string const, std::string*&gt; &gt;<em>) (stl_tree.h:1321)<br />
==13628== by 0x805404F: std::_Rb_tree&lt;std::string, std::pair&lt;std::string const, std::string</em>&gt;, std::_Select1st&lt;std::pair&lt;std::string const, std::string*&gt; &gt;, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator&lt;std::pair&lt;std::string const, std::string*&gt; &gt; &gt;::~_Rb_tree() (stl_tree.h:592)<br />
==13628== by 0x80540A3: std::map&lt;std::string, std::string*, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator&lt;std::pair&lt;std::string const, std::string*&gt; &gt; &gt;::~map() (stl_map.h:94)<br />
==13628== by 0x805318D: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:56)<br />
==13628== by 0x804F5C7: Hybrid_HMM_Tests() (hybrid_hmm_test.hpp:10)<br />
==13628== by 0x804F616: main (short_test.cpp:8)</p>
</blockquote>
<p>es scheint, das in der map, elemente sind die ich nicht reingepackt habe <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/topic/204931/speicherzugriffsfehler-bei-map-destruktion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 19:43:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204931.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 08 Feb 2008 12:29:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:36:44 GMT]]></title><description><![CDATA[<p>ich habe ein ziemliches problem mit dem folgenden code-schnipsel</p>
<p>ich will einen baum aufbauen, und die nodes sollen möglichst klein werden,<br />
aber jeder node soll einen name haben, also dachte ich mir :<br />
ich speicher pointer zu den namen (deren anzahl ist nämlich ziemlich begrenzt)<br />
in einer map&lt;name, std::string *&gt;<br />
so kann ich schnell den pointer zum namen finden</p>
<p>die erste funktion soll einen namen hinzufügen<br />
die 2. ist der dtor<br />
(std::map elemente muss man eigenlich nicht löschen, aber ohne gehts auch nicht)</p>
<p>sieht wer den fehler?</p>
<pre><code class="language-cpp">const std::string * const HMM_Tree::insertNodeName(const std::string&amp; name)
{
std::map&lt;std::string, std::string * &gt;::const_iterator it = m_node_names.find(name);
if(it != m_node_names.end()) return it-&gt;second;
// else
std::string * new_name = new std::string(name);
m_node_names[name] = new_name;
return new_name;
}

HMM_Tree::~HMM_Tree()
{
// delete the names
typedef std::map&lt;std::string, std::string * &gt;::iterator name_map_it;
for(name_map_it it = m_node_names.begin(); it != m_node_names.end(); ++it)
  {
  delete it-&gt;second;
  it-&gt;second = 0;
  }
}
</code></pre>
<p>anbei noch die valgrind ausgabe</p>
<blockquote>
<p>==13051== Conditional jump or move depends on uninitialised value(s)<br />
==13051== at 0x805316E: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:46)<br />
==13051== by 0x804F6B7: Hybrid_HMM_Tests() (hybrid_hmm_test.hpp:10)<br />
==13051== by 0x804F706: main (short_test.cpp:8)<br />
==13051==<br />
==13051== Use of uninitialised value of size 4<br />
==13051== at 0x8053106: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:48)<br />
==13051== by 0x804F6B7: Hybrid_HMM_Tests() (hybrid_hmm_test.hpp:10)<br />
==13051== by 0x804F706: main (short_test.cpp:8)<br />
==13051==<br />
==13051== Invalid read of size 4<br />
==13051== at 0x40AFDFB: std::string::~string() (in /usr/lib/gcc/i686-pc-linux-gnu/4.2.2/libstdc++.so.6.0.9)<br />
==13051== by 0x805311C: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:48)<br />
==13051== by 0x804F6B7: Hybrid_HMM_Tests() (hybrid_hmm_test.hpp:10)<br />
==13051== by 0x804F706: main (short_test.cpp:8)<br />
==13051== Address 0xe8240485 is not stack'd, malloc'd or (recently) free'd<br />
==13051==<br />
==13051== Process terminating with default action of signal 11 (SIGSEGV)<br />
==13051== Access not within mapped region at address 0xE8240485<br />
==13051== at 0x40AFDFB: std::string::~string() (in /usr/lib/gcc/i686-pc-linux-gnu/4.2.2/libstdc++.so.6.0.9)<br />
==13051== by 0x805311C: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:48)<br />
==13051== by 0x804F6B7: Hybrid_HMM_Tests() (hybrid_hmm_test.hpp:10)<br />
==13051== by 0x804F706: main (short_test.cpp:8)</p>
</blockquote>
<p>das mit der map von strings kommt mir selber ein wenig komisch vor, aber ich<br />
muss die späteren nodes halt so klein wie möglich halten, und sone map<br />
kam mir am besten vor, um schnell von nem string zu nen ptr auf string zu kommen</p>
<p>[edit]<br />
==13051== by 0x805311C: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:48)<br />
is dann diese zeile :</p>
<pre><code class="language-cpp">delete it-&gt;second;
</code></pre>
<p>was ich aber nicht verstehe, denn der ptr müsste doch wegen</p>
<pre><code class="language-cpp">std::string * new_name = new std::string(name);
m_node_names[name] = new_name;
</code></pre>
<p>valid sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>wenn ich den ganzen dtor auskommentiere kommt so sowas :</p>
<blockquote>
<p>==13628== Conditional jump or move depends on uninitialised value(s)<br />
==13628== at 0x8054025: std::_Rb_tree&lt;std::string, std::pair&lt;std::string const, std::string*&gt;, std::_Select1st&lt;std::pair&lt;std::string const, std::string*&gt; &gt;, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator&lt;std::pair&lt;std::string const, std::string*&gt; &gt; &gt;::_M_erase(std::_Rb_tree_node&lt;std::pair&lt;std::string const, std::string*&gt; &gt;<em>) (stl_tree.h:1321)<br />
==13628== by 0x805404F: std::_Rb_tree&lt;std::string, std::pair&lt;std::string const, std::string</em>&gt;, std::_Select1st&lt;std::pair&lt;std::string const, std::string*&gt; &gt;, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator&lt;std::pair&lt;std::string const, std::string*&gt; &gt; &gt;::~_Rb_tree() (stl_tree.h:592)<br />
==13628== by 0x80540A3: std::map&lt;std::string, std::string*, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator&lt;std::pair&lt;std::string const, std::string*&gt; &gt; &gt;::~map() (stl_map.h:94)<br />
==13628== by 0x805318D: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:56)<br />
==13628== by 0x804F5C7: Hybrid_HMM_Tests() (hybrid_hmm_test.hpp:10)<br />
==13628== by 0x804F616: main (short_test.cpp:8)</p>
</blockquote>
<p>es scheint, das in der map, elemente sind die ich nicht reingepackt habe <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/1451913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451913</guid><dc:creator><![CDATA[Treb]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:36:44 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:35:51 GMT]]></title><description><![CDATA[<p>Irgendwie scheint mir die map keinen Sinn zu machen, wenn Key und Value immer gleich sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ansonsten konnte ich auf die Schnelle keinen Fehler finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451918</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:35:51 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:36:36 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Irgendwie scheint mir die map keinen Sinn zu machen, wenn Key und Value immer gleich sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ansonsten konnte ich auf die Schnelle keinen Fehler finden.</p>
</blockquote>
<p>Vielleicht modifiziert er sie woanders und es soll so etwas wie ein &quot;Nachschlagewert&quot; im Sinne von Internationalisierung sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451920</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:36:36 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:38:26 GMT]]></title><description><![CDATA[<p>naja wie gesagt, ich sehe in der map auch keinen sinn, mir gings dabei eigentlich nur ums finden in logarithmischer zeit ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451923</guid><dc:creator><![CDATA[Treb]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:38:26 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:40:29 GMT]]></title><description><![CDATA[<p>Selbstfindung? <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/1451925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451925</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:40:29 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:42:18 GMT]]></title><description><![CDATA[<p>Treb schrieb:</p>
<blockquote>
<p>naja wie gesagt, ich sehe in der map auch keinen sinn, mir gings dabei eigentlich nur ums finden in logarithmischer zeit ...</p>
</blockquote>
<p>std::set?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451928</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:42:18 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:43:09 GMT]]></title><description><![CDATA[<p>Wird die map denn sonstwo noch modifiziert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451929</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:43:09 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:43:12 GMT]]></title><description><![CDATA[<p>ja, ich finds eigentlich auch lustig, aber wie würdet ihr strings abspeichern,<br />
und dann schnell einen ptr zu einen string suchen</p>
<p>wenn ich einen vector nehme, muss ich ja im schlimmsten fall alle element durch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451930</guid><dc:creator><![CDATA[Treb]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:43:12 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:46:34 GMT]]></title><description><![CDATA[<p>Ah, du willst also zur Laufzeit die Strings nicht mit zB m_node_names[name] abrufen, sondern immer direkt mit m_node_names[&quot;narf&quot;]? Was ja nur Sinn machen würde, wenn der String der mit &quot;narf&quot; referenziert wird in der Map irgendwo verändert wird. Und dort vermute ich mal deinen Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451934</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:46:34 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:50:40 GMT]]></title><description><![CDATA[<p>also ich werde jetzt wohl ein set nehmen,<br />
die map wird nirgends modifiziert nur kopiert,</p>
<p>ich denke dabei geht dann irgendwas schief, ich finde übrigens dieses<br />
autolöschen bei map irgendwie doof, sowas macht vector doch auch nicht ...</p>
<p>der eigentliche sinn war, später nodes zu erzeugen, welche einen ptr auf ihren namen haben, und da wollte ich dann einfach die oben gezeigte funktion nehmen,</p>
<p>im tree ist die map als member drin, und würde dann erst nach allen nodes destruiert,<br />
somit wären alle ptr to string immer valid, und ich hätte pro node nur 4bytes verbraucht um den namem zu speichern</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451935</guid><dc:creator><![CDATA[Treb]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:50:40 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:50:58 GMT]]></title><description><![CDATA[<p>Jetzt interessiert mich der Sinn des ganzen doch irgendwie. Kann mir da nämlich dann, wenn nichts modifiziert wird, nichts drunter vorstellen.</p>
<p>Die Funktion insertNodeName(const std::string&amp; name) gibt dann ja immer nur einen Pointer auf eine Kopie des Parameters name zurück. Warum dann nicht gleich &quot;name&quot; nehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451940</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 12:54:18 GMT]]></title><description><![CDATA[<p>Treb schrieb:</p>
<blockquote>
<p>ich denke dabei geht dann irgendwas schief, ich finde übrigens dieses<br />
autolöschen bei map irgendwie doof, sowas macht vector doch auch nicht ...</p>
</blockquote>
<p>Jeder Container der Standardbibliothek löscht seine Element im Destruktor.</p>
<p>Treb schrieb:</p>
<blockquote>
<p>im tree ist die map als member drin, und würde dann erst nach allen nodes destruiert,</p>
</blockquote>
<p>Kopierst du vielleicht den Tree selbst? Dann hast du hoffentlich auch einen passenden Copy-Konstruktor bzw. Zuweisungsoperator.</p>
<p>Treb schrieb:</p>
<blockquote>
<p>somit wären alle ptr to string immer valid, und ich hätte pro node nur 4bytes verbraucht um den namem zu speichern</p>
</blockquote>
<p>Dir ist aber schon klar, dass deine mit new angeforderten Strings auch Speicher verbrauchen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451942</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 08 Feb 2008 12:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 13:04:13 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Jeder Container der Standardbibliothek löscht seine Element im Destruktor.</p>
</blockquote>
<p>In dem Fall aber ja nur den Pointer.</p>
<p>MFK schrieb:</p>
<blockquote>
<p>Dir ist aber schon klar, dass deine mit new angeforderten Strings auch Speicher verbrauchen?</p>
</blockquote>
<p>Immer nur beim ersten Aufruf. Danach wird nur noch der Pointer auf jenen vorher erstellten String zurückgegeben.</p>
<p>EDIT:</p>
<p>Eine Methode die ich sauberer finde:</p>
<p>Statt einen Pointer auf einen Namen bekommt jeder Node eine TypeID (Enum). Dazu eine Memberfunktion die anhand der TypeID den Namen zurückgibt. Braucht noch weniger Speicher. <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/1451947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451947</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 08 Feb 2008 13:04:13 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 13:04:22 GMT]]></title><description><![CDATA[<p>Was du willst ist ein std::set in deiner Tree-Klasse and ein std::set::const_iterator in deiner Node-Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451950</guid><dc:creator><![CDATA[lolz_ausgeloggt]]></dc:creator><pubDate>Fri, 08 Feb 2008 13:04:22 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 13:12:34 GMT]]></title><description><![CDATA[<p>ok, ich muss einen baum aufbauen, und der baum besteht aus vielen<br />
sub-bäumen,</p>
<p>jeder node hat einen namen, von den namen gibts ca 50<br />
die bäume werden aber viele 1000 nodes haben, wovon viele natürlich<br />
den selben namen haben werden<br />
(es wird eben ein such-graph, wo die nodes zustände sind, und man kann<br />
verschiedene zustände auch öfter besuchen)</p>
<p>ich wollte mir nun das speichern des names im node selber sparen, und jeder<br />
node sollte nur einen pointer auf den namen haben, weil es eben viel mehr nodes als namen geben wird ...</p>
<p>beim erzeugen der nodes brauchte ich nun einen ptr auf den namen, und so wollte ich die finden ...</p>
<p>hätte ich einen vector genommen</p>
<pre><code class="language-cpp">std::vector&lt;std::string&gt; m_node_names;
</code></pre>
<p>hätte ich immer über den ganzen vector iterieren müssen, um nachzusehen ob name schon drin, (hätte dann aber adresse sofort über &amp;m_node_names[i] zurückgegen können)</p>
<p>die std::set version sieht nun so aus</p>
<pre><code class="language-cpp">const std::string * const HMM_Tree::insertNodeName(const std::string&amp; name)
{
std::set&lt;std::string&gt;::iterator it = m_node_names.find(name);
if(it != m_node_names.end()) return &amp;(*it);
// else
m_node_names.insert(name);
it = m_node_names.find(name);
return &amp;(*it);
}
</code></pre>
<p>und irgendwie glaube ich, meine stl-implementierung hat da irgendwo ne macke,<br />
dann nun bekomme ich</p>
<blockquote>
<p>==14333== Conditional jump or move depends on uninitialised value(s)<br />
==14333== at 0x8053733: std::_Rb_tree&lt;std::string, std::string, std::_Identity<a href="std::string" rel="nofollow">std::string</a>, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt;::_M_erase(std::_Rb_tree_node<a href="std::string" rel="nofollow">std::string</a><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="😉"
    /> (stl_tree.h:1321)<br />
==14333== by 0x805375D: std::_Rb_tree&lt;std::string, std::string, std::_Identity<a href="std::string" rel="nofollow">std::string</a>, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt;::~_Rb_tree() (stl_tree.h:592)<br />
==14333== by 0x80537B1: std::set&lt;std::string, std::less<a href="std::string" rel="nofollow">std::string</a>, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt;::~set() (stl_set.h:94)<br />
==14333== by 0x80529CD: HMM_Tree::~HMM_Tree() (hmm_tree.cpp:55)</p>
</blockquote>
<p>aber das nehme ich mal als &quot;warnung&quot; hin ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451958</guid><dc:creator><![CDATA[Treb]]></dc:creator><pubDate>Fri, 08 Feb 2008 13:12:34 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 13:21:46 GMT]]></title><description><![CDATA[<p>Treb schrieb:</p>
<blockquote>
<p>und irgendwie glaube ich, meine stl-implementierung hat da irgendwo ne macke</p>
</blockquote>
<p>Und ich glaube, du zerlegst dir irgendwo in deinem restlichen Code den Speicher.</p>
<p>Du kannst deine Funktion übrigens etwas vereinfachen:</p>
<pre><code class="language-cpp">const std::string * const HMM_Tree::insertNodeName(const std::string&amp; name)
{
    return &amp;(*(m_node_names.insert(name).first));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1451961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451961</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 08 Feb 2008 13:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 13:21:39 GMT]]></title><description><![CDATA[<p>Nein!<br />
So macht man das nicht, du fügst beim einfügen einfach mit insert den Namen in das set ein, dann bekommst du ein std::pair zurück wovon der erste ein Iterator auf den String ist und diesen Iterator speicherst du als const_iterator-Attribut in deinem Node-Objekt.</p>
<p>Alles andere ist quark, besonders deine insertNodeName-Methode...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451965</guid><dc:creator><![CDATA[lolz_ausgeloggt]]></dc:creator><pubDate>Fri, 08 Feb 2008 13:21:39 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 13:24:24 GMT]]></title><description><![CDATA[<p>ok, ich entschuldige mich</p>
<pre><code class="language-cpp">HMM_Tree HMM_ToTree(const Hybrid_LR_HMM&amp; hmm)
{
std::string name = hmm.getName();
std::size_t numStates = hmm.numStates();
Matrix&lt;double&gt; trans_probs(hmm.trans_probs());

HMM_Tree ret_val;

for(std::size_t i=0; i &lt; numStates -1; i++)
  {
  std::stringstream ss;
  ss &lt;&lt; name &lt;&lt; i;
  std::string subNodeName;
  ss &gt;&gt; subNodeName;
  ret_val.insertNodeName(subNodeName);
  std::cout &lt;&lt; &quot;Inserting node &quot; &lt;&lt; subNodeName &lt;&lt; std::endl;
  }
return ret_val;
}
</code></pre>
<p>ohne</p>
<pre><code class="language-cpp">return ret_val;
</code></pre>
<p>was ich wegen unsinnigkeit zuerst weggelassen habe, kommt der fehler von oben,<br />
nun läufts sauber und ich kann den baum aufbauen,<br />
danke für den tip mit dem set <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
und entschuldigung für die aufregung <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>
<p>lolz_ausgeloggt schrieb:</p>
<blockquote>
<p>Nein!<br />
So macht man das nicht, du fügst beim einfügen einfach mit insert den Namen in das set ein, dann bekommst du ein std::pair zurück wovon der erste ein Iterator auf den String ist und diesen Iterator speicherst du als const_iterator-Attribut in deinem Node-Objekt.</p>
<p>Alles andere ist quark, besonders deine insertNodeName-Methode...</p>
</blockquote>
<p>ist schon abgeändert ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451967</guid><dc:creator><![CDATA[Treb]]></dc:creator><pubDate>Fri, 08 Feb 2008 13:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to speicherzugriffsfehler bei map destruktion on Fri, 08 Feb 2008 13:28:23 GMT]]></title><description><![CDATA[<p>Sehe ich das richtig, dass du in der Methode nur die Strings für den Baum einlesen willst?</p>
<p>Wie bzw. wo erzeugst du denn deine Knoten?</p>
<p>Diesen Schritt mit den Namen könntest du auch weglassen, wenn du Zugriff auf die Namen beim erzeugen der Knoten hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1451969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1451969</guid><dc:creator><![CDATA[lolz_ausgeloggt]]></dc:creator><pubDate>Fri, 08 Feb 2008 13:28:23 GMT</pubDate></item></channel></rss>