<?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[Speicherverletzungen]]></title><description><![CDATA[<p>Hi liebe Community,</p>
<p>Ich bin relativ neu bei C++ und habe programmieren mit Java begonnen.</p>
<p>Nun habe ich eine Aufgabe bekommen und erhalte bei Ausführen des Programms, wenn ich Methoden <strong>öfter</strong> aufrufe Speicherverletzungen. Ich habe absichtlich die Pointer vermieden um dieses Problem zu umgehen und weiß nun nicht was ich falsch gemacht habe. Eventuell könntet ihr mal über meine main-Klasse drüber schaun und mir einen Tipp geben.</p>
<p><a href="http://pastebin.com/rFTN2mGq" rel="nofollow">http://pastebin.com/rFTN2mGq</a></p>
<p>Was ist der grundsätzliche Fehler bei meinem Programm?</p>
<p>Hier noch das UML:</p>
<p><a href="http://imageshack.us/photo/my-images/207/uml.png/" rel="nofollow">http://imageshack.us/photo/my-images/207/uml.png/</a></p>
<p>In meinen Objekt-Klassen gibt es eigtl. nur getter und setter sowie manchmal eine toString Methode.<br />
Ich bin um jede Hilfe dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297627/speicherverletzungen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 09:12:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297627.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Jan 2012 15:35:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherverletzungen on Tue, 03 Jan 2012 15:35:19 GMT]]></title><description><![CDATA[<p>Hi liebe Community,</p>
<p>Ich bin relativ neu bei C++ und habe programmieren mit Java begonnen.</p>
<p>Nun habe ich eine Aufgabe bekommen und erhalte bei Ausführen des Programms, wenn ich Methoden <strong>öfter</strong> aufrufe Speicherverletzungen. Ich habe absichtlich die Pointer vermieden um dieses Problem zu umgehen und weiß nun nicht was ich falsch gemacht habe. Eventuell könntet ihr mal über meine main-Klasse drüber schaun und mir einen Tipp geben.</p>
<p><a href="http://pastebin.com/rFTN2mGq" rel="nofollow">http://pastebin.com/rFTN2mGq</a></p>
<p>Was ist der grundsätzliche Fehler bei meinem Programm?</p>
<p>Hier noch das UML:</p>
<p><a href="http://imageshack.us/photo/my-images/207/uml.png/" rel="nofollow">http://imageshack.us/photo/my-images/207/uml.png/</a></p>
<p>In meinen Objekt-Klassen gibt es eigtl. nur getter und setter sowie manchmal eine toString Methode.<br />
Ich bin um jede Hilfe dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163316</guid><dc:creator><![CDATA[4ndro1d]]></dc:creator><pubDate>Tue, 03 Jan 2012 15:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverletzungen on Tue, 03 Jan 2012 20:22:07 GMT]]></title><description><![CDATA[<p>Nimm einen Debugger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163425</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 03 Jan 2012 20:22:07 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverletzungen on Tue, 03 Jan 2012 22:13:06 GMT]]></title><description><![CDATA[<p>In Zeile 178-191 steht:</p>
<pre><code class="language-cpp">void createMediaLibrary(){
	MediaLibrary m;

	cout &lt;&lt; &quot;Create a media library&quot; &lt;&lt; endl;
	cout &lt;&lt; &quot;=====================&quot; &lt;&lt; endl;
	cout &lt;&lt; &quot;Enter the name of the library: &quot;;
	string s;
	cin &gt;&gt; s;
	m.setName(s);

	cout &lt;&lt; &quot;Done! You have succesfully created a new media library!&quot; &lt;&lt; endl;

	_vMediaLibrary.push_back(m);
}
</code></pre>
<p>Meiner Ansicht nach ist der Umgang mit dem Vektor _vMediaLibrary nicht gut gelöst,<br />
besser wäre evtl. eine eigene Funktion, die den Vektor und das Objekt als Parameter (Zeiger oder Referenz) übergibt.</p>
<p>Du hast am Anfang des Programms diverse Vektoren mit globalem Gültigkeitsbereich<br />
erzeugt, das ist glaube ich kein guter Programmierstil(mal gucken ob ich gleich gesteinigt werde... <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="😃"
    /> ), sofern es Alternativen dazu gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163451</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Tue, 03 Jan 2012 22:13:06 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverletzungen on Tue, 03 Jan 2012 22:13:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">AudioTrack* track = (AudioTrack*) vTrack[i];
cout &lt;&lt; ss.str() + &quot;: &quot; + track-&gt;toString() &lt;&lt; endl;
delete track;
</code></pre>
<p>Das sieht nicht so aus, als wenn es das täte, was du willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163463</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 03 Jan 2012 22:13:56 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverletzungen on Tue, 03 Jan 2012 23:41:31 GMT]]></title><description><![CDATA[<p>Ich hab's jeztt nur überflogen…</p>
<p>3mal &quot;Ihhh!!&quot;:</p>
<ul>
<li>globale Objekte</li>
<li>C-style Casts</li>
<li>Speichern von Zeigern auf Elemente von Vektoren die sich eventuell vergrößern</li>
</ul>
<p>Die C-style Cast Syntax ist zwar in Java üblich, bedeutet da aber etwas anderes. In C und C++ bedeutet das: &quot;Hey, Compiler! Ich weiß es besser als Du und Du musst auch nichts überprüfen. Vertrau mir einfach und halt die Schnauze!&quot;. Wenn Track und AudioTrack, VideoTrack in einer Vererbungshierarchie stecken und Track polymorph ist (wofür du selbst sorgen musst, das wird dir nämlich nicht wie bei Java aufgezwungen), dann ist ein dynamic_cast viel passender -- wobei ein dynamic_cast eigentlich recht seltend passend ist. Vermeide so'was einfach durch ein ggf besseres Design…</p>
<p>Wenn Vektoren sich vergrößern, werden Objekte eventuell umkopiert. Dadurch werden natürlich Zeiger auf die alten Objekte ungültig, weil die neuen ganz woanders im Speicher stehen werden.</p>
<p>Über die tendentielle Schlechtigkeit von globalen Objekten muss ich hoffentlich nichts mehr sagen.</p>
<p>Tipp am Rande: Die Unterschiede zwischen Java und C++ werden von Dir wahrscheinlich unterschätzt. Ich hoffe, Du hast Dir ein schlaues C++ Buch besorgt. <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="😉"
    /> Ich habe auch Java vor C++ gelernt. Deswegen kenne ich das schon…</p>
<p>Cheers!<br />
kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163490</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 03 Jan 2012 23:41:31 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverletzungen on Wed, 04 Jan 2012 10:47:04 GMT]]></title><description><![CDATA[<p>Mein Problem war, dass ich die Objekte alle so erstellen muss:</p>
<p>MediaLibrary* m = new MediaLibrary();</p>
<p>Da ich jetzt alles auf Pointer umgebaut hab, funzt das so.</p>
<p>otze schrieb:</p>
<blockquote>
<pre><code class="language-cpp">AudioTrack* track = (AudioTrack*) vTrack[i];
cout &lt;&lt; ss.str() + &quot;: &quot; + track-&gt;toString() &lt;&lt; endl;
delete track;
</code></pre>
<p>Das sieht nicht so aus, als wenn es das täte, was du willst.</p>
</blockquote>
<p>Doch, das tut es. Da ich für die Klasse Track keine eigene toString() habe, sondern nur für AudioTrack und VideoTrack muss ich die Objekte erst casten und dann die gewünschte toString() aufrufen. Hätte man sicherlich eleganter lösen können. (dynamic_cast) so wie krümel das schon gesagt hat.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Ich hab's jeztt nur überflogen…</p>
<p>Über die tendentielle Schlechtigkeit von globalen Objekten muss ich hoffentlich nichts mehr sagen.</p>
<p>Tipp am Rande: Die Unterschiede zwischen Java und C++ werden von Dir wahrscheinlich unterschätzt. Ich hoffe, Du hast Dir ein schlaues C++ Buch besorgt. <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="😉"
    /> Ich habe auch Java vor C++ gelernt. Deswegen kenne ich das schon…</p>
<p>Cheers!<br />
kk</p>
</blockquote>
<p>Leider habe ich noch kein Buch besorgt, werde ich vl noch machen, wenn ich wieder mit C++ was zu tun hab. Da ich aber Mobile Computer bin, werd ich mich wschl in Zukunft sowieso mehr auf Android und iOS konzentrieren. Aber das Fach muss ich ja trotzdem positiv abschließen.</p>
<p>Globale variablen in diesem Fall schlecht, weil? Würde es schonmal besser sein diese private zu machen?</p>
<p>Lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163586</guid><dc:creator><![CDATA[4ndro1d]]></dc:creator><pubDate>Wed, 04 Jan 2012 10:47:04 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverletzungen on Wed, 04 Jan 2012 11:17:17 GMT]]></title><description><![CDATA[<p>globale variablen sind aus folgenden gründen schlecht:</p>
<p>- sie können von überall geändert werden, da kann man gut den überblick verlieren, wann das passiert -&gt; wann sich fehler einschleichen<br />
- sie nutzen die komplette programmlaufzeit speicher, obwohl sie vielleicht gar nicht gebraucht werden<br />
- sie schaffen weitere abhängigkeiten zwischen kompilierungseinheiten (du inkludierst in headerA.h eine headerB.h datei, in headerA wird aber ein globales objekt benutzt/gebraucht, welches erst in headerB definiert wird)</p>
<p>- to be continued</p>
<p>4ndro1d schrieb:</p>
<blockquote>
<p>otze schrieb:</p>
<blockquote>
<pre><code class="language-cpp">AudioTrack* track = (AudioTrack*) vTrack[i];
cout &lt;&lt; ss.str() + &quot;: &quot; + track-&gt;toString() &lt;&lt; endl;
delete track;
</code></pre>
<p>Das sieht nicht so aus, als wenn es das täte, was du willst.</p>
</blockquote>
<p>Doch, das tut es. Da ich für die Klasse Track keine eigene toString() habe, sondern nur für AudioTrack und VideoTrack muss ich die Objekte erst casten und dann die gewünschte toString() aufrufen. Hätte man sicherlich eleganter lösen können. (dynamic_cast) so wie krümel das schon gesagt hat.</p>
</blockquote>
<p>nein, das tut es nicht. was du machst ist ein downcast, dafür ist eigentlich dynamic_cast da, und eine fallunerscheidung, weil dieser cast auch schiefgehen kann. ok, das klappt aber hier.<br />
das ding ist nur das delete danach.</p>
<p>du hast einen vector, wo ein objekt drin ist. das objekt holst du dir mit vTrack[i], ok. aber dann löschst du das. d.h. du entziehst dem, der die controlle hat über die speicherverwaltung (also dem vector, der das am ende selbst löschen würde), eben die kontrolle, indem du ein objekt löscht. das es klappt bei dir ist wiederum glück, vielleicht implodiert ja das universum wenn ich dein programm auf meinem rechner ausführen lasse. warum? weil das ziemlich gut undefined behaviour sein könnte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163600</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 04 Jan 2012 11:17:17 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverletzungen on Wed, 04 Jan 2012 11:37:47 GMT]]></title><description><![CDATA[<p><a href="http://pastebin.com/rM9u3Euf" rel="nofollow">http://pastebin.com/rM9u3Euf</a></p>
<p>So läuft jetzt alles wie ich es will <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="🙂"
    /><br />
Also sollt ich die ganzen Methoden noch in ne extra Klasse packen incl. der globalen Variablen und dann in der main nur über getter/setter zugreifen?<br />
(Werd ich in diesem Fall aber eh nimmer machen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163612</guid><dc:creator><![CDATA[4ndro1d]]></dc:creator><pubDate>Wed, 04 Jan 2012 11:37:47 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverletzungen on Wed, 04 Jan 2012 11:38:54 GMT]]></title><description><![CDATA[<p>Achja und wie funktioniert denn das mit dem dynamic_cast dann?<br />
Das muss in der Klasse Track angegeben werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163613</guid><dc:creator><![CDATA[4ndro1d]]></dc:creator><pubDate>Wed, 04 Jan 2012 11:38:54 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverletzungen on Wed, 04 Jan 2012 11:46:47 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">cass Base
{
public:
    std::string toString();
    virtual ~Base();
};

class Derive : public Base
{
public:
    std::vector&lt;char&gt; toCharArray();
};

int main()
{
    Base * b = new Derive;  // alles kein problem, upcast implizit
    b.toString(); // alles legal
    b.toCharArray(); nicht legal, da b ein Base ist. Und das obwohl es eigentlich ein Derive ist!! Also vorsicht...

    // Derive * d = (Derive*)(&amp;b); // war deine möglichkeit, aber das ist mies

    Derive * d = dynamic_cast&lt;Derive&gt;(&amp;b);
    if ( !d ) // wen der cast fehlschlägt, zeigt d auf NULL -&gt; nullptr
        std::cout &lt;&lt; &quot;Cast Failed!&quot; &lt;&lt; std::endl;

    d.toCharArray();

    delete b; // dran denken, wenn du mit pointern rummachst, aber nicht d UND b löschen! eins von beiden reicht, und da du b die speicher rechte quasi gegeben ahst oben mit new, mach es auch über b wieder sauber

    return 0x0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2163618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163618</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 04 Jan 2012 11:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverletzungen on Wed, 04 Jan 2012 13:09:16 GMT]]></title><description><![CDATA[<p>4ndro1d schrieb:</p>
<blockquote>
<p>Achja und wie funktioniert denn das mit dem dynamic_cast dann?</p>
</blockquote>
<p>Wie das funktioniert? Ich nehme mal an, dass der Compiler Code erzeugt, der zur Laufzeit Metadaten überprüft, die der Compiler für polymorphe Klassen anlegt. Wie genau das funktioniert ist nicht interessant. Interessant ist die Syntax und die Regeln dazu und das findet man ganz schnell im Netz für lau … oder schön erklärt in einem guten Buch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163675</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 04 Jan 2012 13:09:16 GMT</pubDate></item></channel></rss>