<?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[Pointer-Problem?]]></title><description><![CDATA[<p>Hi, ich habe in meinem Programm Vectoren von Pointern genutzt. Diese Pointer habe ich nun gegen Objecte getauscht, allerdings funktioniert das Programm jetzt nicht mehr/stürzt ab. Im Folgenden mal ein Beispielprogramm:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

class Test
{
public:
	Test();
	~Test();

	void Load();
	int* pointer;
};

Test::Test() :
	pointer(nullptr)
{
}

Test::~Test()
{
	delete pointer;
}

void Test::Load()
{
	pointer = new int(24);
}

std::vector&lt;Test&gt; vec;

void Create()
{
	Test test;
	test.Load();
	vec.push_back(test);
}

int main()
{
	std::wcout &lt;&lt; L&quot;Testprogramm:&quot; &lt;&lt; std::endl;
	Create();
	std::wcout &lt;&lt; *vec.front().pointer &lt;&lt; std::endl;
	std::wcout &lt;&lt; L&quot;Ende!&quot; &lt;&lt; std::endl;
	while(true){};
	return 0;
}
</code></pre>
<p>In der Funktion &quot;Create&quot; wird ja eine Kopie des temporären Objects &quot;test&quot; dem Vector &quot;vec&quot; hinzugefügt. Meine Vermutung ist, dass dabei allerdings nicht das Object auf das der Pointer &quot;pointer&quot; zeigt kopiert wird sondern nur der Pointer selber also die Adresse des Objects auf welches er zeigt. Da &quot;test&quot; aber nur temporär ist und das Object auf das &quot;pointer&quot; zeigt im Destructor vernichtet wird zeigt der Pointer der &quot;test&quot;-Kopie die im Vector abgelegt wurde ins Nirvana.<br />
Ist das richtig? Was kann ich tun damit dieser Fehler nicht mehr auftritt?</p>
<p>Gruß</p>
<p>C/C++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287451/pointer-problem</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 10:25:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287451.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 28 May 2011 22:24:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer-Problem? on Sat, 28 May 2011 22:24:38 GMT]]></title><description><![CDATA[<p>Hi, ich habe in meinem Programm Vectoren von Pointern genutzt. Diese Pointer habe ich nun gegen Objecte getauscht, allerdings funktioniert das Programm jetzt nicht mehr/stürzt ab. Im Folgenden mal ein Beispielprogramm:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

class Test
{
public:
	Test();
	~Test();

	void Load();
	int* pointer;
};

Test::Test() :
	pointer(nullptr)
{
}

Test::~Test()
{
	delete pointer;
}

void Test::Load()
{
	pointer = new int(24);
}

std::vector&lt;Test&gt; vec;

void Create()
{
	Test test;
	test.Load();
	vec.push_back(test);
}

int main()
{
	std::wcout &lt;&lt; L&quot;Testprogramm:&quot; &lt;&lt; std::endl;
	Create();
	std::wcout &lt;&lt; *vec.front().pointer &lt;&lt; std::endl;
	std::wcout &lt;&lt; L&quot;Ende!&quot; &lt;&lt; std::endl;
	while(true){};
	return 0;
}
</code></pre>
<p>In der Funktion &quot;Create&quot; wird ja eine Kopie des temporären Objects &quot;test&quot; dem Vector &quot;vec&quot; hinzugefügt. Meine Vermutung ist, dass dabei allerdings nicht das Object auf das der Pointer &quot;pointer&quot; zeigt kopiert wird sondern nur der Pointer selber also die Adresse des Objects auf welches er zeigt. Da &quot;test&quot; aber nur temporär ist und das Object auf das &quot;pointer&quot; zeigt im Destructor vernichtet wird zeigt der Pointer der &quot;test&quot;-Kopie die im Vector abgelegt wurde ins Nirvana.<br />
Ist das richtig? Was kann ich tun damit dieser Fehler nicht mehr auftritt?</p>
<p>Gruß</p>
<p>C/C++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070269</guid><dc:creator><![CDATA[C&#x2F;C++]]></dc:creator><pubDate>Sat, 28 May 2011 22:24:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sat, 28 May 2011 22:26:38 GMT]]></title><description><![CDATA[<p>Erstens hast du Konstruktoren nicht verstanden, zweitens keine CodeTags verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070270</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 28 May 2011 22:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sat, 28 May 2011 22:30:41 GMT]]></title><description><![CDATA[<p>Doch, ich habe Konstruktoren verstanden und Code Tags habe ich auch verwendet, sonst würde der Code ja als Text angezeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070273</guid><dc:creator><![CDATA[C&#x2F;C++]]></dc:creator><pubDate>Sat, 28 May 2011 22:30:41 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sat, 28 May 2011 22:31:33 GMT]]></title><description><![CDATA[<p>Ich meinte die cpp-Tags. Und offenbar hast du Konstruktoren nicht verstanden, sonst hättest du keine Load-Funktion.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

class Test
{
public:
    Test();
    ~Test();

    void Load();
    int* pointer;
};

Test::Test() :
    pointer(nullptr)
{
}

Test::~Test()
{
    delete pointer;
}

void Test::Load()
{
    pointer = new int(24);
}

std::vector&lt;Test&gt; vec;

void Create()
{
    Test test;
    test.Load();
    vec.push_back(test);
}

int main()
{
    std::wcout &lt;&lt; L&quot;Testprogramm:&quot; &lt;&lt; std::endl;
    Create();
    std::wcout &lt;&lt; *vec.front().pointer &lt;&lt; std::endl;
    std::wcout &lt;&lt; L&quot;Ende!&quot; &lt;&lt; std::endl;
    while(true){};
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2070274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070274</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 28 May 2011 22:31:33 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sat, 28 May 2011 22:31:45 GMT]]></title><description><![CDATA[<p>Und drittens hast du die Regel der &quot;Großen Drei&quot; nicht verstanden - beim Kopieren in den vector&lt;&gt; wird eine Kopie von <code>test</code> angelegt und anschließend das Objekt selbst zerstört (letzteres ruft dessen Destruktor auf).</p>
<p>Die einfachste Lösung besteht wohl darin, keine nackten Zeiger zu verwenden, sondern die Informationen sauber zu verpacken (ein int passt auch direkt ins Objekt, ansonsten such mal nach Containern und Smart-Pointern).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070275</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 28 May 2011 22:31:45 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sat, 28 May 2011 22:41:54 GMT]]></title><description><![CDATA[<blockquote>
<p>Und drittens hast du die Regel der &quot;Großen Drei&quot; nicht verstanden - beim Kopieren in den vector&lt;&gt; wird eine Kopie von test angelegt und anschließend das Objekt selbst zerstört (letzteres ruft dessen Destruktor auf).</p>
</blockquote>
<p>Habe ich doch als Vermutung geschrieben.</p>
<p>Jungs, das ist nur ein Beispielprogramm. Der wirkliche Code sieht ganz anders aus. Ich habe hier nur als Beispiel einen int-Zeiger genommen. Und dass ich diesen nicht im Konstruktor initialisiere ist so gewollt, da der Wert eben auch &quot;NULL&quot; sein können muss.<br />
Smartpointer wollte ich nach Möglichkeit vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070280</guid><dc:creator><![CDATA[C&#x2F;C++]]></dc:creator><pubDate>Sat, 28 May 2011 22:41:54 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sat, 28 May 2011 22:46:11 GMT]]></title><description><![CDATA[<p>Wenn du schon weißt, wie die Lösung aussieht, warum fragst du dann noch?</p>
<p>Und ohne Smart-Pointer bleibt dir nichts anderes übrig, als die Kopier-Operationen auch zu definieren - entweder du kopierst den gesamten Block, den die Load()-Funktion reserviert hat, oder du zählst mit, wieviele Objekte diesen Block nutzen. (möglich sind auch Zwischenlösungen, bei denen du erst kopierst, wenn eins der Objekte den Speicherbereich ändern will)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070283</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 28 May 2011 22:46:11 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sat, 28 May 2011 22:52:50 GMT]]></title><description><![CDATA[<p>Die Lösung kenne ich noch nicht, ich weis aber sehr genau wie ich es nicht lösen möchte ;).<br />
Meinst du damit dass ich dann z.B. den =-Operator überschreiben muss? Das wäre aus meiner Sicht die einfachste Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070284</guid><dc:creator><![CDATA[C&#x2F;C++]]></dc:creator><pubDate>Sat, 28 May 2011 22:52:50 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sat, 28 May 2011 22:55:54 GMT]]></title><description><![CDATA[<p>Ja, genau den mußt du überschreiben - und den Kopier-Konstruktor ( <code>Test::Test(const Test&amp; src);</code> ).</p>
<p>(das meinte ich dort oben mit den &quot;Großen Drei&quot; - Destruktor, Zuweisung und Kopier-Konstruktor treten grundsätzlich im Team auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070286</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 28 May 2011 22:55:54 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sat, 28 May 2011 23:03:53 GMT]]></title><description><![CDATA[<p>Alles klar, dann werde ich es mal so probieren. Danke euch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070289</guid><dc:creator><![CDATA[C&#x2F;C++]]></dc:creator><pubDate>Sat, 28 May 2011 23:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sun, 29 May 2011 10:44:36 GMT]]></title><description><![CDATA[<p>C/C++ schrieb:</p>
<blockquote>
<p>Jungs, das ist nur ein Beispielprogramm. Der wirkliche Code sieht ganz anders aus.</p>
</blockquote>
<p>Warum führst du die Leute dann mit falschem Code aufs Glatteis?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070406</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 29 May 2011 10:44:36 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Sun, 29 May 2011 13:09:38 GMT]]></title><description><![CDATA[<p>Ich habe halt ein Minimal-Beispiel gepostet damit man den Fehler schnell nachvollziehen kann und ihr euch nicht durch unnötig viel Code wälzen müsst. Leider bekommt man hier immer erstmal 5 Posts die dann irgendwelche anderen Dinge im Code bemängeln was auch nicht verkehrt ist, habe schließlich so schon mehrere hilfreiche Tipps hier im Forum bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070469</guid><dc:creator><![CDATA[C&#x2F;C++]]></dc:creator><pubDate>Sun, 29 May 2011 13:09:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Mon, 30 May 2011 15:28:06 GMT]]></title><description><![CDATA[<p>So, habe jetzt mal versucht das ganze zu implemtieren, allerdings fürchte ich das wird so nicht funktionieren. Denn anstatt eines Int-Zeigers ist der Zeiger vom Typ Base und kann auch auf von Base abgeleitete Objekte zeigen was das Kopieren des Objects im Kopiekonstructor wohl unmöglich macht? Ich habe auch mal versucht anstatt einem Zeiger das Object selber zu nehmen, allerdings wurden dann bei virtuellen Funktionen nur noch die der Base-Klasse aufgerufen. Dann werde ich wohl doch Smart-Pointer brauchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071028</guid><dc:creator><![CDATA[C&#x2F;C++]]></dc:creator><pubDate>Mon, 30 May 2011 15:28:06 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Mon, 30 May 2011 16:01:35 GMT]]></title><description><![CDATA[<p>Wenn du dein komplettes abgeleitetes Objekt kopieren willst, dann sollte das Objekt das besser selber machen - normalerweise in Form einer virtuellen clone()-Methode.<br />
Alternativ verwendest du Referenzzählung (d.h. die Kopien verwenden das selbe Objekt und erst der letzte kümmert sich darum, es wieder zu vernichten).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071038</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 May 2011 16:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Mon, 30 May 2011 16:23:41 GMT]]></title><description><![CDATA[<p>Das mit dem Copy-Konstruktor ist nicht so einfach. Zuerst einmal sind dort 2 Klassen beteiligt. Einmal der (Ich nenn ihn mal) Handler - Das ist die Klasse die den pointer enthält. Und einmal die Base, von der die realen Klassen abgeleitet werden. Damit das richtig funktioniert benötigt der Handler Copy-Konstruktor, Zuweisung und Destruktor. Der Rest geht dann nicht automatisch. Für das Kopieren fügt man der Klasse Base eine virtuelle Funktion (z.B. &quot;Copy&quot;) hinzu, was eine mit new erzeugte Kopie von sich selbst zurück gibt.</p>
<pre><code class="language-cpp">class Handler
{
    ....

    Handler(const Handler &amp; source)
    {
        pointer = source.pointer-&gt;Copy();
    }

    ....
    Base * pointer;
};

class Base
{
    ...

    virtual Base * Copy() = 0;

    ...
};

class Real : public Base
{
    ...

    virtual Base * Copy()
    {
        return new Real(*this);
    };

    ...
};
</code></pre>
<p>Das kann natürlich noch etwas sauberer ausgeführt werden ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071046</guid><dc:creator><![CDATA[tunichtgut]]></dc:creator><pubDate>Mon, 30 May 2011 16:23:41 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem? on Mon, 30 May 2011 19:00:38 GMT]]></title><description><![CDATA[<p>Mit Smart-Pointers, die intelligent genug sind, kann man auch polymorph kopieren. Dann kann man sich das intrusive Clone-Idiom sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071145</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 30 May 2011 19:00:38 GMT</pubDate></item></channel></rss>