<?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[Virtuelles Problem, Virtualtable, Speicherzugriffsfehler, Wer ist Spezialist?]]></title><description><![CDATA[<p>Grüß Euch,</p>
<p>Ich habe ein Problem, daß eigentlich keines ist, da ich weiß an welchem Punkt das Programm scheitert, aber nicht warum bzw. die internen Vorgänge, bezüglich virtueller Methodenüberschreibung und Aufruf der Konstruktoren etc., nicht genau nachvollziehen kann, andererseits bin ich rein zufällig auf dieses &quot;Problem&quot; gestoßen, indem ich in der Basisklasse das Schlüsselvort &quot;virtual&quot; vergessen habe.</p>
<p>Wahrscheinlich liegts am Virtualtable und einem unzulässigen Verweis.</p>
<p>Vielleicht ist einer von Euch Spezialist, der mir genau sagen kann, an was es hier genau scheitert.<br />
Folgend das Programm in stark vereinfachter und nachvollziehbarer Form, bei dem der Speicherfehler bzw. eine Speicherzugriffsverletzung noch auftritt.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

class Basis
{
public:

	Basis(void)
	{
		printf(&quot;Konstruktor Basis\n&quot;);
	}

	~Basis()
	{
		printf(&quot;Destruktor Basis\n&quot;);
	}	

	// Hier habe ich das Schluesselwort &quot;virtual&quot; vergessen bzw. weggelassen. ( virtual void Func(void) )
	void Func(void)
	{
		printf(&quot;Func von Basis...\n&quot;);
	}
};

class Abgeleitet : public Basis
{
public:

	Abgeleitet(void)
	{
		printf(&quot;Konstruktor Abgeleitet\n&quot;);
	}

	~Abgeleitet()
	{
		printf(&quot;Destruktor Abgeleitet\n&quot;);
	}

	virtual void Func(void)
	{
		printf(&quot;Func von Abgeleitet...\n&quot;);
	}

};

void main()
{
	Basis *pBasis;

	pBasis = new Abgeleitet;

	// Loescht man das Objekt, kommt es zu einem Speicherzugriffsfehler, 
	// nachdem, in Reihenfolge, der Konstruktor der Basisklasse un der abgeleiteten Klasse
	// und der Destruktor der Basisklasse aufgerufen wird, aber bevor der Destruktor
	// der abgeleiteten Klasse aufgerufen wird.
	delete(pBasis);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/143517/virtuelles-problem-virtualtable-speicherzugriffsfehler-wer-ist-spezialist</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 06:48:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/143517.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Apr 2006 12:17:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Virtuelles Problem, Virtualtable, Speicherzugriffsfehler, Wer ist Spezialist? on Sun, 09 Apr 2006 12:17:21 GMT]]></title><description><![CDATA[<p>Grüß Euch,</p>
<p>Ich habe ein Problem, daß eigentlich keines ist, da ich weiß an welchem Punkt das Programm scheitert, aber nicht warum bzw. die internen Vorgänge, bezüglich virtueller Methodenüberschreibung und Aufruf der Konstruktoren etc., nicht genau nachvollziehen kann, andererseits bin ich rein zufällig auf dieses &quot;Problem&quot; gestoßen, indem ich in der Basisklasse das Schlüsselvort &quot;virtual&quot; vergessen habe.</p>
<p>Wahrscheinlich liegts am Virtualtable und einem unzulässigen Verweis.</p>
<p>Vielleicht ist einer von Euch Spezialist, der mir genau sagen kann, an was es hier genau scheitert.<br />
Folgend das Programm in stark vereinfachter und nachvollziehbarer Form, bei dem der Speicherfehler bzw. eine Speicherzugriffsverletzung noch auftritt.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

class Basis
{
public:

	Basis(void)
	{
		printf(&quot;Konstruktor Basis\n&quot;);
	}

	~Basis()
	{
		printf(&quot;Destruktor Basis\n&quot;);
	}	

	// Hier habe ich das Schluesselwort &quot;virtual&quot; vergessen bzw. weggelassen. ( virtual void Func(void) )
	void Func(void)
	{
		printf(&quot;Func von Basis...\n&quot;);
	}
};

class Abgeleitet : public Basis
{
public:

	Abgeleitet(void)
	{
		printf(&quot;Konstruktor Abgeleitet\n&quot;);
	}

	~Abgeleitet()
	{
		printf(&quot;Destruktor Abgeleitet\n&quot;);
	}

	virtual void Func(void)
	{
		printf(&quot;Func von Abgeleitet...\n&quot;);
	}

};

void main()
{
	Basis *pBasis;

	pBasis = new Abgeleitet;

	// Loescht man das Objekt, kommt es zu einem Speicherzugriffsfehler, 
	// nachdem, in Reihenfolge, der Konstruktor der Basisklasse un der abgeleiteten Klasse
	// und der Destruktor der Basisklasse aufgerufen wird, aber bevor der Destruktor
	// der abgeleiteten Klasse aufgerufen wird.
	delete(pBasis);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1033720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1033720</guid><dc:creator><![CDATA[Gigabyte]]></dc:creator><pubDate>Sun, 09 Apr 2006 12:17:21 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelles Problem, Virtualtable, Speicherzugriffsfehler, Wer ist Spezialist? on Sun, 09 Apr 2006 12:29:19 GMT]]></title><description><![CDATA[<p>Du machst einen Fehler:</p>
<p>Bei Klassen mit virtuellen Funktionen oder Klassen, von denen andere Abgeleitet werden sollen, sollte der Destruktor <strong>IMMER</strong> virtuell sein, da sonst bei Objekten, die über einen Zeiger auf die Basisklasse verwaltet werden nur der Destruktor der Basis, aber nicht der der abgeleiteten Klasse verwendet wird.</p>
<p>Neuer Code:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

class Basis
{
public:

    Basis(void)
    {
        printf(&quot;Konstruktor Basis\n&quot;);
    }

    virtual ~Basis() //Diese Destruktor sollte virtual sein
    {
        printf(&quot;Destruktor Basis\n&quot;);
    }   

    // Hier habe ich das Schluesselwort &quot;virtual&quot; vergessen bzw. weggelassen. ( virtual void Func(void) )
    void Func(void)
    {
        printf(&quot;Func von Basis...\n&quot;);
    }
};

class Abgeleitet : public Basis
{
public:

    Abgeleitet(void)
    {
        printf(&quot;Konstruktor Abgeleitet\n&quot;);
    }

    virtual ~Abgeleitet()//Dieser dann auch
    {
        printf(&quot;Destruktor Abgeleitet\n&quot;);
    }

    virtual void Func(void)
    {
        printf(&quot;Func von Abgeleitet...\n&quot;);
    }

};

int main() //Main MUSS laut Standard einen int zurückgeben
{
    Basis *pBasis;

    pBasis = new Abgeleitet;

    // Loescht man das Objekt, kommt es zu einem Speicherzugriffsfehler,
    // nachdem, in Reihenfolge, der Konstruktor der Basisklasse un der abgeleiteten Klasse
    // und der Destruktor der Basisklasse aufgerufen wird, aber bevor der Destruktor
    // der abgeleiteten Klasse aufgerufen wird.
    delete(pBasis);
    return(0);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1033729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1033729</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sun, 09 Apr 2006 12:29:19 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelles Problem, Virtualtable, Speicherzugriffsfehler, Wer ist Spezialist? on Sun, 09 Apr 2006 13:20:27 GMT]]></title><description><![CDATA[<p>Hi Phoemuex,</p>
<p>Herzlichen Danke für Deine rasche und kompetente Antwort.</p>
<p>Habs zeitgleich im Grundlagenbuch nachgeschlagen, in der die Notwendigkeit eines virtuellen Destruktors beschrieben ist, aufgrund des Nichtaufrufs des Destruktors der Abgeleiteten Klasse, bei nicht virtueller Vereinbarung.</p>
<p>Was mich aber noch interessieren würde, wieso es überhaupt zum Absturz, in der unkorrigierten Version, kommt.</p>
<p>Vielleicht hat irgendwer eine Erkärung hierfür.</p>
<p>Liebe Grüße Gigabyte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1033770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1033770</guid><dc:creator><![CDATA[Gigabyte]]></dc:creator><pubDate>Sun, 09 Apr 2006 13:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelles Problem, Virtualtable, Speicherzugriffsfehler, Wer ist Spezialist? on Sun, 09 Apr 2006 16:13:47 GMT]]></title><description><![CDATA[<p>Phoemuex schrieb:</p>
<blockquote>
<pre><code class="language-cpp">virtual ~Abgeleitet()//Dieser dann auch
    {
        printf(&quot;Destruktor Abgeleitet\n&quot;);
    }
</code></pre>
</blockquote>
<p>Warum eigentlich? Das versteh ich irgentwie nicht, bei mir klappt's auch, wenn nur die Basisklasse einen virtuellen Destruktor hat.</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1033936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1033936</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Sun, 09 Apr 2006 16:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelles Problem, Virtualtable, Speicherzugriffsfehler, Wer ist Spezialist? on Sun, 09 Apr 2006 16:30:50 GMT]]></title><description><![CDATA[<p>Ja, wäre nicht zwingend erforderlich, da eine Angabe von &quot;virtuell&quot; des Destruktors in der abgeleiteten Klasse, den Destruktor der Basisklasse automatisch als virtuell markiert.<br />
Aber alles zwei legitim.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1033956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1033956</guid><dc:creator><![CDATA[Gigabyte]]></dc:creator><pubDate>Sun, 09 Apr 2006 16:30:50 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelles Problem, Virtualtable, Speicherzugriffsfehler, Wer ist Spezialist? on Mon, 10 Apr 2006 06:12:25 GMT]]></title><description><![CDATA[<p>Gigabyte schrieb:</p>
<blockquote>
<p>Was mich aber noch interessieren würde, wieso es überhaupt zum Absturz, in der unkorrigierten Version, kommt.</p>
</blockquote>
<p>Nun, das liegt schlichtweg daran, dass der dtor nicht virtuell ist. delete bekommt als Argument ja lediglich einen Zeiger auf die Basisklasse. Und da der dtor nicht virtuell ist, wird delete das Objekt so behandeln, als wäre es ein Basisklassenobjekt. Was es allerdings nicht ist. Dadurch kann es dazu kommen, dass der Compiler Fehler verursacht, je nach Implementation.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1034234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1034234</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 10 Apr 2006 06:12:25 GMT</pubDate></item></channel></rss>