<?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 der Speicherverwaltung - vermutlich]]></title><description><![CDATA[<p>Der nachfolgende Code wird korrekt ausgeführt, aber nach der Ausführung wird eine Fehlermeldung ausgegeben, welche u.a. diesen Hinweis enthält: &quot;probably corrupted stack&quot;<br />
Das Problem scheint vordergründig durch diese Zuweisung zu entstehen:</p>
<pre><code>listeners[listenersCounter] = *listener;
</code></pre>
<pre><code class="language-cpp">class Signal {
public:
    Signal();
    virtual ~Signal();
    float getValue() { return(value); }
    void setValue(float vlaue);
    void addListener(Signal* listener);
    void signalUpdated(Signal* signal);
private:
    float value;
    int listenersCounter;
    Signal *listeners;
};
</code></pre>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

#include &quot;Signal.h&quot;

Signal::Signal() {
  value = 0.0;
  listenersCounter = 0;
  listeners = NULL;
}

Signal::~Signal() {
  if (listenersCounter &gt; 0) {
      free(listeners);
  }
}

void Signal::addListener(Signal* listener) {
  listeners = (Signal*)realloc(listeners, sizeof(listener) * (listenersCounter + 1));
  // CAUSES THE CRASH!
  listeners[listenersCounter] = *listener;
  ++listenersCounter;
}

void Signal::setValue(float value) {
  this-&gt;value = value;
  for (int i=0; i&lt;listenersCounter; i++) {
    listeners[i].signalUpdated(this);
  }
}

void Signal::signalUpdated(Signal* signal) {
  printf(&quot;The signal's value: %f\n&quot;, signal-&gt;getValue());
}
</code></pre>
<pre><code class="language-cpp">#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;

#include &quot;Signal.h&quot;

int main(int argc, char** argv) {
  Signal signal1;
  signal1.setValue(1.1);
  printf(&quot;Value signal1: %f\n&quot;, signal1.getValue());

  Signal signal2;
  signal2.setValue(2.2);
  printf(&quot;Value signal2: %f\n&quot;, signal2.getValue());

  signal1.addListener(&amp;signal2);
  signal1.setValue(3.3);
}
</code></pre>
<p>Ich verwende diesen Code in einem Mikrocontroller, dessen Compiler nur einen beschränkten C++ Sprachumfang unterstützt. Aus diesem Grund kann ich keine C++ spezifische Funktionalität zur Verwaltung dynamischer Arrays verwenden.</p>
<p>Vielen Dank für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243014/problem-mit-der-speicherverwaltung-vermutlich</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 15:10:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243014.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Jun 2009 07:49:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung - vermutlich on Thu, 11 Jun 2009 07:49:52 GMT]]></title><description><![CDATA[<p>Der nachfolgende Code wird korrekt ausgeführt, aber nach der Ausführung wird eine Fehlermeldung ausgegeben, welche u.a. diesen Hinweis enthält: &quot;probably corrupted stack&quot;<br />
Das Problem scheint vordergründig durch diese Zuweisung zu entstehen:</p>
<pre><code>listeners[listenersCounter] = *listener;
</code></pre>
<pre><code class="language-cpp">class Signal {
public:
    Signal();
    virtual ~Signal();
    float getValue() { return(value); }
    void setValue(float vlaue);
    void addListener(Signal* listener);
    void signalUpdated(Signal* signal);
private:
    float value;
    int listenersCounter;
    Signal *listeners;
};
</code></pre>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

#include &quot;Signal.h&quot;

Signal::Signal() {
  value = 0.0;
  listenersCounter = 0;
  listeners = NULL;
}

Signal::~Signal() {
  if (listenersCounter &gt; 0) {
      free(listeners);
  }
}

void Signal::addListener(Signal* listener) {
  listeners = (Signal*)realloc(listeners, sizeof(listener) * (listenersCounter + 1));
  // CAUSES THE CRASH!
  listeners[listenersCounter] = *listener;
  ++listenersCounter;
}

void Signal::setValue(float value) {
  this-&gt;value = value;
  for (int i=0; i&lt;listenersCounter; i++) {
    listeners[i].signalUpdated(this);
  }
}

void Signal::signalUpdated(Signal* signal) {
  printf(&quot;The signal's value: %f\n&quot;, signal-&gt;getValue());
}
</code></pre>
<pre><code class="language-cpp">#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;

#include &quot;Signal.h&quot;

int main(int argc, char** argv) {
  Signal signal1;
  signal1.setValue(1.1);
  printf(&quot;Value signal1: %f\n&quot;, signal1.getValue());

  Signal signal2;
  signal2.setValue(2.2);
  printf(&quot;Value signal2: %f\n&quot;, signal2.getValue());

  signal1.addListener(&amp;signal2);
  signal1.setValue(3.3);
}
</code></pre>
<p>Ich verwende diesen Code in einem Mikrocontroller, dessen Compiler nur einen beschränkten C++ Sprachumfang unterstützt. Aus diesem Grund kann ich keine C++ spezifische Funktionalität zur Verwaltung dynamischer Arrays verwenden.</p>
<p>Vielen Dank für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724915</guid><dc:creator><![CDATA[jaron]]></dc:creator><pubDate>Thu, 11 Jun 2009 07:49:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung - vermutlich on Thu, 11 Jun 2009 07:52:52 GMT]]></title><description><![CDATA[<p>Dein Mikrocontroller kommt mit klassen klar, aber du kannst kein new verwenden? Das ist eigenartig,aber ich kenne mich acuh nicht so mit Mikrocontroller aus.Wäre es denn möglich das du new verwendest, weil das würde die sache etwas vereinfachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724916</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Thu, 11 Jun 2009 07:52:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung - vermutlich on Thu, 11 Jun 2009 08:00:16 GMT]]></title><description><![CDATA[<p>Das geht nicht. Wenn Du C-Funktionen für die Speicheranforderungen benutzt, werden die Konstruktoren Deiner Klassen nicht aufgerufen. Vermutlich ist <code>listenersCounter</code> nicht initialisiert, und Deine Arrayindizes zeigen daher ins Nirvana.<br />
Also entweder, Du bekommst heraus, wie Du die C++-Operatoren für die Speicheranforderung zum Laufen bekommst (das MUSS eigentlich gehen), oder Du programmierst das Ding in C.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724919</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 11 Jun 2009 08:00:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung - vermutlich on Thu, 11 Jun 2009 08:12:27 GMT]]></title><description><![CDATA[<p>Ich kann <em>new</em> und <em>delete</em> verwenden und damit ist mein Problem gelöst.<br />
Danke für die Antworten!</p>
<pre><code class="language-cpp">#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;

#include &quot;Signal.h&quot;

int main(int argc, char** argv) {
  Signal *signal1 = new Signal;
  signal1-&gt;setValue(1.1);
  printf(&quot;Value signal1: %f\n&quot;, signal1-&gt;getValue());

  Signal *signal2 = new Signal;
  printf(&quot;Value signal2: %f\n&quot;, signal2-&gt;getValue());

  signal1-&gt;addListener(signal2);
  signal1-&gt;setValue(3.3);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1724921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724921</guid><dc:creator><![CDATA[jaron]]></dc:creator><pubDate>Thu, 11 Jun 2009 08:12:27 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung - vermutlich on Thu, 11 Jun 2009 08:12:00 GMT]]></title><description><![CDATA[<p>Ja dann benutz es doch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724923</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Thu, 11 Jun 2009 08:12:00 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung - vermutlich on Thu, 11 Jun 2009 08:24:05 GMT]]></title><description><![CDATA[<p>Ihr seid schnell hier und darum hat sich mein geänderter Eintrag mit dem von Firefighter überschnitten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724929</guid><dc:creator><![CDATA[jaron]]></dc:creator><pubDate>Thu, 11 Jun 2009 08:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit der Speicherverwaltung - vermutlich on Thu, 11 Jun 2009 08:28:06 GMT]]></title><description><![CDATA[<p>eigentlich meinten wir eher, du sollst da wo du aktuell mit c-speichermanagment arbeitst, auf das c++ äquivivalent umsteigen.Da wo realloc steht, kommt new hin.<br />
Lies dir mal durch wie man richtig mit new umgeht, dann sollte das kein Problem für dich sein, denke ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724930</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Thu, 11 Jun 2009 08:28:06 GMT</pubDate></item></channel></rss>