<?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[Smartpointer Problem]]></title><description><![CDATA[<p>Hi,</p>
<p>ich befasse mich seit Kurzem mit Smartpointern, genauer gesagt mit std::unique_ptr.</p>
<p>Mein Frage:</p>
<p>Ich möchte einen unique_ptr an eine andere Klasse übergeben, wo er dann in einen std::vector gespeichert wird. Ist das irgendwie möglich, oder muss ich da shared_ptr verwenden?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/331735/smartpointer-problem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 08:48:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/331735.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Mar 2015 07:45:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 07:49:50 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich befasse mich seit Kurzem mit Smartpointern, genauer gesagt mit std::unique_ptr.</p>
<p>Mein Frage:</p>
<p>Ich möchte einen unique_ptr an eine andere Klasse übergeben, wo er dann in einen std::vector gespeichert wird. Ist das irgendwie möglich, oder muss ich da shared_ptr verwenden?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447001</guid><dc:creator><![CDATA[Raven280438]]></dc:creator><pubDate>Tue, 17 Mar 2015 07:49:50 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 07:51:57 GMT]]></title><description><![CDATA[<p>Raven280438 schrieb:</p>
<blockquote>
<p>Hi,</p>
<p>ich befasse mich seit Kurzem mit Smartpointern, genauer gesagt mit std::unique_ptr.</p>
<p>Mein Fragen:</p>
<p>1.)<br />
Ist es irgendwie möglich einen unique_ptr nicht in der Initialisierungsliste der Klasse zu initialisieren, sondern erst später in einer anderen Methode?</p>
<p>2.)<br />
Ich möchte einen unique_ptr an eine andere Klasse übergeben, wo er dann in einen std::vector gespeichert wird. Ist das irgendwie möglich, oder muss ich da shared_ptr verwenden?</p>
<p>Gruß</p>
</blockquote>
<p>1. Ja, das ist möglich. Entweder einfach einen neuen std::unique_ptr&lt;..&gt; zuweisen oder mit std::unqiue_ptr&lt;..&gt;::reset(..)<br />
2. Ja, das ist möglich mit dem std::unique_ptr&lt;..&gt;, allerdings wird dann gemoved, ev. nicht das was du möchtest. std::shared_ptr benötigst du nur dann, wenn du geteilten Besitz hast - in den allermeisten Fällen ist das nicht der Fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447002</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 17 Mar 2015 07:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 09:03:57 GMT]]></title><description><![CDATA[<p>Raven280438 schrieb:</p>
<blockquote>
<p>Ich möchte einen unique_ptr an eine andere Klasse übergeben, wo er dann in einen std::vector gespeichert wird. Ist das irgendwie möglich, oder muss ich da shared_ptr verwenden?</p>
</blockquote>
<p>Warum benutzt du einen unique_ptr?<br />
Warum willst du ihn übergeben?<br />
Bist du sicher, dass du an dieser Stelle nicht einen &quot;normalen&quot; Pointer oder eine Referenz willst?</p>
<p>Überall nur noch Smartpointer zu verwenden ist eine dumme Idee. Ihre Aufgabe ist es, ein Objekt solange am Leben zu erhalten, bis es nicht mehr benötigt wird und es danach wirklich zu löschen. Sie sollen Pointer und Referenzen nicht vollständig ersetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447011</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 17 Mar 2015 09:03:57 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 09:50:51 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>zum konkreten Problem:<br />
Ich bastel grad ein bisschen mit DirectX11 und habe da einen Gamestate-Manager.<br />
Diesem kann man ein Gamestate hinzufügen und er speichert sie in einem Vector.<br />
Der Vector soll dann unique_ptr enthalten, damit sie beim Beenden wieder gelöscht werden.</p>
<p>Wie gehe ich das am Besten an? Soll ich der AddGamestate()-Methode einen normalen Zeiger übergeben, in einen unique_ptr umwandeln und dann im Vector speichern, oder kann ich auch direkt einen unique_ptr übergeben?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447021</guid><dc:creator><![CDATA[Raven280438]]></dc:creator><pubDate>Tue, 17 Mar 2015 09:50:51 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 10:34:13 GMT]]></title><description><![CDATA[<p>Warum enthält der Vektor überhaupt Pointer auf Gamestate und nicht Gamestate - Objekte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447023</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 17 Mar 2015 10:34:13 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 11:12:02 GMT]]></title><description><![CDATA[<p>Warum fügt man dem GameState-Manager GameStates hinzu? Warum erzeugt er diese nicht selber?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447029</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 17 Mar 2015 11:12:02 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 11:18:25 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>mein Gamestate-Klasse ist Abstrakt.<br />
Die richigen Gamestates werden von dieser Klasse abgeleitet.</p>
<p>Die Gamestates sind nicht Teil meiner &quot;Engine&quot; sondern werden im Programm selber erzeugt, damit man mit ihnen Arbeiten kann.</p>
<p>Wenn man jetzt zB 2 verschiedene Spiele mit der gleichen Engine hat, kann der GamestateManager doch garnicht alle möglichen Gamestates kennen (um sie erzeugen zu können). Die kennt doch nur das jeweilige Programm, oder?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447031</guid><dc:creator><![CDATA[Raven280438]]></dc:creator><pubDate>Tue, 17 Mar 2015 11:18:25 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 13:17:42 GMT]]></title><description><![CDATA[<p>Für mich hört sich das Konzept merkwürdig an. Aber ohne Details zu kennen (die ich eigentlich auch gar nicht kennen will) kann man wenig dazu sagen.<br />
Möglicherweise wäre das Problem mit Templates zu lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447040</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 17 Mar 2015 13:17:42 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 14:45:54 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>vielleicht hab ich den Sinn von GameStates auch nicht verstanden <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="😉"
    /></p>
<p>Für mich ist zB das Start-Menu ein Gamestate.<br />
Wenn ich aber 2 verschiedene Spiele mit der gleichen Engine programmiere, sind die Menus doch völlig unterschiedlich zueinander.<br />
Deshalb kann der Manager die ja auch nicht kennen.</p>
<p>Ich wollte dann im eigendlichen Spiel einfach eine Klasse von meinem Abstrakten Gamestate ableiten und an den Manager schicken.<br />
Wenn das Spiel dann beendet wird, sollen auch alle Gamestates gelöscht werden (deshalb dachte ich an unique_ptr im GameStateManager).</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447053</guid><dc:creator><![CDATA[Raven280438]]></dc:creator><pubDate>Tue, 17 Mar 2015 14:45:54 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 15:01:28 GMT]]></title><description><![CDATA[<p>Also zu dem ganzen Gamestate-Ansatz sage ich mal nichts, mach da ruhig einfach mal weiter, wenn's dann am Ende nicht perfekt ist hast du ja zumindest was gelernt. Und hey, irgendwie wird es schon funktionieren. Wegen dem unique_ptr: std::move ist dein Freund!</p>
<pre><code>#include &lt;vector&gt;
#include &lt;memory&gt;

class game_state
{};

class game_state_manager // Damn a manager class :(
{
	std::vector&lt;std::unique_ptr&lt;game_state&gt;&gt; game_states_;

public:
	game_state* add_state(std::unique_ptr&lt;game_state&gt; state)
	{
		game_states_.push_back(std::move(state));
		return game_states_.back().get();
	}
};

int main()
{
	game_state_manager gsm;
	auto state = std::make_unique&lt;game_state&gt;();
	auto state_ptr = gsm.add_state(std::move(state));
}
</code></pre>
<p>So in etwas wolltest du das, oder? Alles verstaendlich? RValue-References und std::move solltest du dir vermutlich noch mal angucken. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447055</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 17 Mar 2015 15:01:28 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 15:36:00 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>danke für den Code.</p>
<p>Was gibts denn für Alternativen zu Gamestates? Ich will natürlich weiter dazulernen <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="😉"
    /></p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447058</guid><dc:creator><![CDATA[Raven280438]]></dc:creator><pubDate>Tue, 17 Mar 2015 15:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Tue, 17 Mar 2015 17:15:52 GMT]]></title><description><![CDATA[<p>Gamestates ueber abstrakte Klassen verteilen sieht mir sehr nach overengeneering aus, denn ueblicherweise ist das eine einfache FSM.<br />
Meistens hat man ein enum fuer die ganzen Zustaende, die GameState-Klasse empfaengt events und ruft dann ueber ein switch die richtige Funktion auf. Das ist sehr viel konkreter und Funktionalitaet laesst sich leichter ergaenzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447069</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Tue, 17 Mar 2015 17:15:52 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Fri, 20 Mar 2015 08:48:30 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>werden bei unique_ptr irgendwie bei der Initialisierung schon Objekte angelegt und wieder gelöscht?<br />
Ich habe das Problem, dass bei der Initialisierung Destruktoren von Objekten aufgerufen werden, die eigendlich noch garnicht existieren dürften.<br />
Diese Objekte sind nicht richtig initialisiert (vielleicht weil sie keinen Default-Konstruktor habe), deshalb gibts beim Löschen wieder Probleme.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447392</guid><dc:creator><![CDATA[Raven280438]]></dc:creator><pubDate>Fri, 20 Mar 2015 08:48:30 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Fri, 20 Mar 2015 08:58:25 GMT]]></title><description><![CDATA[<p>Raven280438 schrieb:</p>
<blockquote>
<p>werden bei unique_ptr irgendwie bei der Initialisierung schon Objekte angelegt und wieder gelöscht?</p>
</blockquote>
<p>Hängt davon ab, ohne deinen Code zu sehen, kann man das nicht sagen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447394</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 20 Mar 2015 08:58:25 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Fri, 20 Mar 2015 08:58:41 GMT]]></title><description><![CDATA[<p>Raven280438 schrieb:</p>
<blockquote>
<p>werden bei unique_ptr irgendwie bei der Initialisierung schon Objekte angelegt und wieder gelöscht?</p>
</blockquote>
<p>Nicht die Typen, auf die der Zeiger zeigt. Intern werden natürlich schon Objekte erzeugt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447395</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 20 Mar 2015 08:58:41 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Fri, 20 Mar 2015 09:07:08 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Intern werden natürlich schon Objekte erzeugt.</p>
</blockquote>
<p>Ist das so 'natürlich'? Was soll denn da erzeugt werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447396</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Fri, 20 Mar 2015 09:07:08 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Fri, 20 Mar 2015 09:08:55 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Intern werden natürlich schon Objekte erzeugt.</p>
</blockquote>
<p>Ist das so 'natürlich'? Was soll denn da erzeugt werden?</p>
</blockquote>
<p>Der unique_ptr selber?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447397</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 20 Mar 2015 09:08:55 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Fri, 20 Mar 2015 09:09:45 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Intern werden natürlich schon Objekte erzeugt.</p>
</blockquote>
<p>Ist das so 'natürlich'? Was soll denn da erzeugt werden?</p>
</blockquote>
<p>beispielsweise der Deleter... <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447398</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 20 Mar 2015 09:09:45 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Fri, 20 Mar 2015 09:17:05 GMT]]></title><description><![CDATA[<p>Mmh, ok, hab irgendwie aus dem 'no-size-overhead' geschlossen, dass da nichts erzeugt wird.<br />
Aber auch ein leerer Deleter muss ja erzeugt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447400</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Fri, 20 Mar 2015 09:17:05 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Sat, 21 Mar 2015 17:23:48 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>im Detail:</p>
<p>Ich habe 2 Klassen:</p>
<pre><code>class Primitives::Triangle : public IRenderable
{
[...]
];

class TestApp::TestState
{
private:
std::unique_ptr&lt;Primitives::Triangle&gt; Triangle;
[...]
};
</code></pre>
<p>Im Konstruktor der TestState-Klasse wird das Triangle erzeugt:</p>
<pre><code>this-&gt;Triangle = std::unique_ptr&lt;Primitives::Triangle&gt;(new Primitives::Triangle(glm::vec3(50, 100, 0), glm::vec3(100, 50, 0), glm::vec3(150, 100, 0)));
</code></pre>
<p>Durch Breakpoints hab ich rausgefunden, es wird zuerst der Kontruktor der Triangle-Klasse aufgerufen, dann sofort wieder der Destruktor.<br />
Beim Beenden des Programms wird dann nochmal der Destruktor der Triangle-Klasse aufgerufen, was zu Problemen führt.</p>
<p>Liegt das an dem unique_ptr, oder hab ich irgendwo anders im Programm einen Fehler?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447550</guid><dc:creator><![CDATA[Raven280438]]></dc:creator><pubDate>Sat, 21 Mar 2015 17:23:48 GMT</pubDate></item><item><title><![CDATA[Reply to Smartpointer Problem on Sat, 21 Mar 2015 18:52:12 GMT]]></title><description><![CDATA[<p>Wieso muss das Triangle überhaupt mit new erzeugt werden, wieso nicht einfach</p>
<pre><code class="language-cpp">class TestApp::TestState
{
private:
 Primitives::Triangle Triangle;
[...]
};
</code></pre>
<p>Raven280438 schrieb:</p>
<blockquote>
<p>Durch Breakpoints hab ich rausgefunden, es wird zuerst der Kontruktor der Triangle-Klasse aufgerufen, dann sofort wieder der Destruktor.<br />
Beim Beenden des Programms wird dann nochmal der Destruktor der Triangle-Klasse aufgerufen, was zu Problemen führt.</p>
</blockquote>
<p>Das ist sehr merkwürdig, kann es sein, dass der TestState gleich wieder zerstört wird? Und wieso führt das du Problemen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2447560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2447560</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 21 Mar 2015 18:52:12 GMT</pubDate></item></channel></rss>