<?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[map eintrag zuweisen -&amp;gt; stürzt ab]]></title><description><![CDATA[<p>Ich verwende folgendes:</p>
<pre><code class="language-cpp">#include &lt;map&gt;
#include &lt;string&gt;
using std::string;

static enum m_ErrorStringValue {
	ev_MMC_COM_open,
	ev_MMC_COM_close
};

static std::map&lt;std::string, m_ErrorStringValue&gt; mapErrorStringValues;
</code></pre>
<pre><code class="language-cpp">mapErrorStringValues[&quot;MMC_COM_open&quot;]	= ev_MMC_COM_open;
	mapErrorStringValues[&quot;MMC_COM_close&quot;]	= ev_MMC_COM_close;
</code></pre>
<p>was aber zur Zugriffsverletzung in map.h führt an der Stelle:</p>
<pre><code class="language-cpp">mapped_type&amp; operator[](const key_type&amp; _Keyval)
		{	// find element matching _Keyval or insert with default mapped
		iterator _Where = this-&gt;lower_bound(_Keyval);
</code></pre>
<p>Warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208434/map-eintrag-zuweisen-gt-stürzt-ab</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 19:37:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208434.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Mar 2008 13:09:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to map eintrag zuweisen -&amp;gt; stürzt ab on Tue, 18 Mar 2008 13:09:30 GMT]]></title><description><![CDATA[<p>Ich verwende folgendes:</p>
<pre><code class="language-cpp">#include &lt;map&gt;
#include &lt;string&gt;
using std::string;

static enum m_ErrorStringValue {
	ev_MMC_COM_open,
	ev_MMC_COM_close
};

static std::map&lt;std::string, m_ErrorStringValue&gt; mapErrorStringValues;
</code></pre>
<pre><code class="language-cpp">mapErrorStringValues[&quot;MMC_COM_open&quot;]	= ev_MMC_COM_open;
	mapErrorStringValues[&quot;MMC_COM_close&quot;]	= ev_MMC_COM_close;
</code></pre>
<p>was aber zur Zugriffsverletzung in map.h führt an der Stelle:</p>
<pre><code class="language-cpp">mapped_type&amp; operator[](const key_type&amp; _Keyval)
		{	// find element matching _Keyval or insert with default mapped
		iterator _Where = this-&gt;lower_bound(_Keyval);
</code></pre>
<p>Warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476553</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:09:30 GMT</pubDate></item><item><title><![CDATA[Reply to map eintrag zuweisen -&amp;gt; stürzt ab on Tue, 18 Mar 2008 13:29:45 GMT]]></title><description><![CDATA[<blockquote>
<p>using std::string;</p>
</blockquote>
<p>Warum machst du using std::string, wenn du nacher eh std::string schreibst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476578</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:29:45 GMT</pubDate></item><item><title><![CDATA[Reply to map eintrag zuweisen -&amp;gt; stürzt ab on Tue, 18 Mar 2008 13:38:15 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<blockquote>
<p>using std::string;</p>
</blockquote>
<p>Warum machst du using std::string, wenn du nacher eh std::string schreibst?</p>
</blockquote>
<p>Das kann ich rausnehmen, ändert aber an dem Fehler nichts.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476583</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:38:15 GMT</pubDate></item><item><title><![CDATA[Reply to map eintrag zuweisen -&amp;gt; stürzt ab on Tue, 18 Mar 2008 13:42:08 GMT]]></title><description><![CDATA[<p>Zeig uns doch mal deinen Aufruf. Die map-Implementierung interessiert weniger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476588</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:42:08 GMT</pubDate></item><item><title><![CDATA[Reply to map eintrag zuweisen -&amp;gt; stürzt ab on Tue, 18 Mar 2008 13:43:20 GMT]]></title><description><![CDATA[<p>Ich sehe (angesichts des zur Verfügung stehenden Quellcodes) bislang zwei Möglichkeiten:<br />
1. Du schießt dir den Heap (lange) vor dem Zugriff kaputt, merkst es aber erst dort.<br />
2. Du hast den Zugriff in einer Funktion, welche vom Konstruktor eines globalen Objektes aus aufgerufen wird, welches in einer anderen Übersetzungseinheit als die Map lebt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476589</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:43:20 GMT</pubDate></item><item><title><![CDATA[Reply to map eintrag zuweisen -&amp;gt; stürzt ab on Tue, 18 Mar 2008 13:43:48 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Zeig uns doch mal deinen Aufruf. Die map-Implementierung interessiert weniger.</p>
</blockquote>
<p>Was meinst du mit 'Aufruf'? Abstürzen tut das Programm an der Stelle:</p>
<pre><code class="language-cpp">mapErrorStringValues[&quot;MMC_COM_open&quot;]    = ev_MMC_COM_open;
</code></pre>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476591</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:43:48 GMT</pubDate></item><item><title><![CDATA[Reply to map eintrag zuweisen -&amp;gt; stürzt ab on Tue, 18 Mar 2008 13:44:45 GMT]]></title><description><![CDATA[<p>Also dieses Stückchen Code funktioniert bei mir ohne einen Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476593</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 18 Mar 2008 13:44:45 GMT</pubDate></item><item><title><![CDATA[Reply to map eintrag zuweisen -&amp;gt; stürzt ab on Tue, 18 Mar 2008 16:00:48 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Ich sehe (angesichts des zur Verfügung stehenden Quellcodes) bislang zwei Möglichkeiten:<br />
1. Du schießt dir den Heap (lange) vor dem Zugriff kaputt, merkst es aber erst dort.<br />
2. Du hast den Zugriff in einer Funktion, welche vom Konstruktor eines globalen Objektes aus aufgerufen wird, welches in einer anderen Übersetzungseinheit als die Map lebt.</p>
</blockquote>
<p>Ich wüsste nicht wo der Fehler sein sollte, da der Code exakt genau so in einem anderen Programm funktioniert hat, daher bin ich auch sehr planlos. _Der einzige Unterschied ist, dass ich jetzt mit Qt und nicht mit MFC programmiere und daher die Header Dateien etwas anders sind.</p>
<p>Das ganze wird aufgerufen durch</p>
<p>GlobalClasses.h</p>
<pre><code class="language-cpp">#include &quot;PI_TranslationStage.h&quot;
extern PI_TranslationStage TranslationStage;
</code></pre>
<p>GlobalClasses.cpp</p>
<pre><code class="language-cpp">#include &quot;GlobalClasses.h&quot;
PI_TranslationStage TranslationStage;
</code></pre>
<p>PI_TranslationStage.h</p>
<pre><code class="language-cpp">#include &quot;PI_C862Mercury.h&quot;
#include &quot;PI_TranslationStageData.h&quot;

#include &lt;vector&gt;
#include &lt;limits&gt;
using std::vector;
#include &lt;stdexcept&gt;

#include &lt;map&gt;
#include &lt;string&gt;

...

static enum m_ErrorStringValue {
	ev_MMC_COM_open			,
	ev_MMC_COM_close		,
...};

static std::map&lt;std::string, m_ErrorStringValue&gt; mapErrorStringValues;

/* -------------------------------------------------------------------- */
/* class: PI_TranslationStage 
/* -------------------------------------------------------------------- */
class PI_TranslationStage : public PI_C862Mercury
{
public:
	PI_TranslationStage(void);
	PI_TranslationStage(int const iComPort, int const iSerialSpeed);
	~PI_TranslationStage(void);

public:
	void initValues();
...
</code></pre>
<p>TranslationStage.cpp</p>
<pre><code class="language-cpp">PI_TranslationStage::PI_TranslationStage(void)
{
	initValues();
	int result = LoadDLL();
}
// ------------------------------------------------------
void PI_TranslationStage::initValues()
	initErrorStringValues();
...
}
// ------------------------------------------------------
void PI_TranslationStage::initErrorStringValues()
{
	mapErrorStringValues[&quot;MMC_COM_open&quot;]	= ev_MMC_COM_open;
	mapErrorStringValues[&quot;MMC_COM_close&quot;]	= ev_MMC_COM_close;
...
}
</code></pre>
<p>abstürzen tut das Programm dann genau an der Stelle:</p>
<pre><code class="language-cpp">_Nodeptr _Lbound(const key_type&amp; _Keyval) const
		{	// find leftmost node not less than _Keyval
		_Nodeptr _Pnode = _Root();
</code></pre>
<p>in der Datei &quot;xtree&quot; beim Aufruf von</p>
<pre><code class="language-cpp">iterator _Where = this-&gt;lower_bound(_Keyval);
</code></pre>
<p>in der Datei &quot;map&quot;.</p>
<p>Wenn ich die Funktion 'initErrorStringValues' auskommentieren, dann startet das Programm komplett.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476708</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Tue, 18 Mar 2008 16:00:48 GMT</pubDate></item><item><title><![CDATA[Reply to map eintrag zuweisen -&amp;gt; stürzt ab on Tue, 18 Mar 2008 16:50:40 GMT]]></title><description><![CDATA[<p>Auf Dein Programm trifft Punkt zwei voll und ganz zu. Es sieht so aus als sei der Konstruktor von mapErrorStringValues noch nicht gelaufen, wenn der von TranslationStage läuft. Da beides globale Objekte sind, aber in unterschiedlichen Übersetzungseinheiten, ist die Konstruktorreihenfolge nicht definiert.</p>
<p>Unter anderem um dieses Problem zu umgehen benutzt man in C++ gern Singletons statt globaler Variablen. Ein einfaches Beispiel:</p>
<pre><code class="language-cpp">std::map&lt;std::string, m_ErrorStringValue&gt;&amp; mapErrorStringValues()
{
    static std::map&lt;std::string, m_ErrorStringValue&gt; instance;
    return instance;
}
</code></pre>
<p>So ist garantiert, dass beim ersten Aufruf der Funktion das Objekt konstruiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476752</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 18 Mar 2008 16:50:40 GMT</pubDate></item><item><title><![CDATA[Reply to map eintrag zuweisen -&amp;gt; stürzt ab on Tue, 18 Mar 2008 16:54:46 GMT]]></title><description><![CDATA[<p>Ich habe es jetzt gelöst indem ich die Map definition in die Klasse gepackt habe. Aber trotzdem danke für den Hinweis zu den Singletons.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476755</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Tue, 18 Mar 2008 16:54:46 GMT</pubDate></item></channel></rss>