<?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[nullptr auf Stack und 0xCCCCCCCC]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite momentan ja an einer Baumstruktur (wie <a href="https://www.c-plusplus.net/forum/330294">hier</a> beschrieben. Etwas scheint daran aber noch faul zu sein, da das Ganze gerne mal abstürzt.</p>
<p>Hier mal ein gekürzter Beispiel-Code der das Problem verdeutlicht:</p>
<pre><code>#include &lt;memory&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

template &lt;typename T&gt;
struct node
{
	node&lt;T&gt; *parent_ = nullptr;
	std::vector&lt;std::shared_ptr&lt;node&lt;T&gt;&gt;&gt; children;
	std::shared_ptr&lt;T&gt; data;

	node() {}
	template &lt;typename data_type&gt;
	explicit node(data_type const &amp;data) : data(std::make_shared&lt;data_type&gt;(data)) {}

	node *add_child(T data) {
		children.push_back(std::make_shared&lt;node&gt;(data));
		children.back()-&gt;parent_ = this;
		return children.back().get();
	}

	bool is_root() const { return parent_ == nullptr; }

	node&lt;T&gt; *parent() { return parent_; }
	node&lt;T&gt; const *parent() const { return parent_; }

	size_t depth() const {
		size_t cnt = 0;
		auto cur = this;
		while (!cur-&gt;is_root()) {
			cur = cur-&gt;parent();
			++cnt;
		}
		return cnt;
	}

};

node&lt;int&gt; make_a_node()
{
	node&lt;int&gt; n;
	n.add_child(1);
	return n;
}

int main()
{
	node&lt;int&gt; n1;
	n1.add_child(1);
	node&lt;int&gt; n2 = make_a_node();

	std::cout &lt;&lt; n1.children[0]-&gt;depth() &lt;&lt; '\n'; // Geht
	std::cout &lt;&lt; n2.children[0]-&gt;depth() &lt;&lt; '\n'; // Crasht
}
</code></pre>
<p>Wie man sehen kann erstelle ich zwei (eigentlich) identische <code>node</code> Objekte <code>n1</code> und <code>n2</code> . Beide haben ein Kind von dem ich die Tiefe innerhalb des Baumes ausgeben lassen will. Für den ersten <code>node n1</code> klappt das wunderbar. Bei dem zweiten <code>node</code> , welcher aus der Funktion <code>make_a_node</code> zurückgegeben wird, crasht das Programm aber. Fehlermeldung ist &quot;Access violation reading at location 0xCCCCCCCC&quot;, in der Funktion <code>is_root</code> .</p>
<p>Nach Recherche bei Google scheint dies ein Debug-Code von Visual Studio zu sein, welcher signalisieren soll dass eine nicht initialisierte Stackvariable verwendet wird. Allerdings setze ich <code>parent_</code> doch zu <code>nullptr</code> , wieso wird das dann nicht übernommen bzw. ist nachdem die Funktion <code>make_a_node</code> verlassen wurde &quot;kaputt&quot;?</p>
<p>Das liegt ja anscheinend daran dass der <code>parent_</code> hier nur auf dem Stack liegt, oder? Muss ich diesen dann auch per <code>new</code> auf dem Heap platzieren damit der erhalten bleibt? Wenn ja, wie geht das? Ein <code>parent_ = new nullptr_t();</code> klappt schonmal nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330305/nullptr-auf-stack-und-0xcccccccc</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 11:35:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330305.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Jan 2015 18:20:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Fri, 02 Jan 2015 18:20:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite momentan ja an einer Baumstruktur (wie <a href="https://www.c-plusplus.net/forum/330294">hier</a> beschrieben. Etwas scheint daran aber noch faul zu sein, da das Ganze gerne mal abstürzt.</p>
<p>Hier mal ein gekürzter Beispiel-Code der das Problem verdeutlicht:</p>
<pre><code>#include &lt;memory&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

template &lt;typename T&gt;
struct node
{
	node&lt;T&gt; *parent_ = nullptr;
	std::vector&lt;std::shared_ptr&lt;node&lt;T&gt;&gt;&gt; children;
	std::shared_ptr&lt;T&gt; data;

	node() {}
	template &lt;typename data_type&gt;
	explicit node(data_type const &amp;data) : data(std::make_shared&lt;data_type&gt;(data)) {}

	node *add_child(T data) {
		children.push_back(std::make_shared&lt;node&gt;(data));
		children.back()-&gt;parent_ = this;
		return children.back().get();
	}

	bool is_root() const { return parent_ == nullptr; }

	node&lt;T&gt; *parent() { return parent_; }
	node&lt;T&gt; const *parent() const { return parent_; }

	size_t depth() const {
		size_t cnt = 0;
		auto cur = this;
		while (!cur-&gt;is_root()) {
			cur = cur-&gt;parent();
			++cnt;
		}
		return cnt;
	}

};

node&lt;int&gt; make_a_node()
{
	node&lt;int&gt; n;
	n.add_child(1);
	return n;
}

int main()
{
	node&lt;int&gt; n1;
	n1.add_child(1);
	node&lt;int&gt; n2 = make_a_node();

	std::cout &lt;&lt; n1.children[0]-&gt;depth() &lt;&lt; '\n'; // Geht
	std::cout &lt;&lt; n2.children[0]-&gt;depth() &lt;&lt; '\n'; // Crasht
}
</code></pre>
<p>Wie man sehen kann erstelle ich zwei (eigentlich) identische <code>node</code> Objekte <code>n1</code> und <code>n2</code> . Beide haben ein Kind von dem ich die Tiefe innerhalb des Baumes ausgeben lassen will. Für den ersten <code>node n1</code> klappt das wunderbar. Bei dem zweiten <code>node</code> , welcher aus der Funktion <code>make_a_node</code> zurückgegeben wird, crasht das Programm aber. Fehlermeldung ist &quot;Access violation reading at location 0xCCCCCCCC&quot;, in der Funktion <code>is_root</code> .</p>
<p>Nach Recherche bei Google scheint dies ein Debug-Code von Visual Studio zu sein, welcher signalisieren soll dass eine nicht initialisierte Stackvariable verwendet wird. Allerdings setze ich <code>parent_</code> doch zu <code>nullptr</code> , wieso wird das dann nicht übernommen bzw. ist nachdem die Funktion <code>make_a_node</code> verlassen wurde &quot;kaputt&quot;?</p>
<p>Das liegt ja anscheinend daran dass der <code>parent_</code> hier nur auf dem Stack liegt, oder? Muss ich diesen dann auch per <code>new</code> auf dem Heap platzieren damit der erhalten bleibt? Wenn ja, wie geht das? Ein <code>parent_ = new nullptr_t();</code> klappt schonmal nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435803</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Fri, 02 Jan 2015 18:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Fri, 02 Jan 2015 18:31:18 GMT]]></title><description><![CDATA[<p>Der Fehler liegt bei</p>
<pre><code class="language-cpp">children.back()-&gt;parent_ = this;
</code></pre>
<p>, weil der node die Adresse ändert, wenn er kopiert wird.</p>
<p>- Wenn du shared_ptr verwendest, brauchst du std::enable_shared_from_this und mache aus parent einen weak_ptr. Das geht, ist aber semantisch unsinnig.<br />
- Mache dir die Besitz-Abhängigkeiten klar. Stelle sicher, dass node nur als unique_ptr erstellt werden kann (also mach den Konstruktor privat). Dann kann die Adresse nicht mehr geändert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435804</guid><dc:creator><![CDATA[tissie]]></dc:creator><pubDate>Fri, 02 Jan 2015 18:31:18 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Fri, 02 Jan 2015 19:19:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ok bezüglich des unique_ptr's war ich mir noch unsicher, wegen der Diskussion im oben verlinkten Thread (da gab es ja noch keinen so richtigen Konsens).</p>
<p>tissie schrieb:</p>
<blockquote>
<p>Der Fehler liegt bei</p>
<pre><code class="language-cpp">children.back()-&gt;parent_ = this;
</code></pre>
<p>, weil der node die Adresse ändert, wenn er kopiert wird.</p>
</blockquote>
<p>Ok... aber ich kopiere doch nur den Pointer und nicht das node objekt selbst? Also das führt dann auch zu einer Adress-Änderung?</p>
<p>tissie schrieb:</p>
<blockquote>
<p>- Mache dir die Besitz-Abhängigkeiten klar. Stelle sicher, dass node nur als unique_ptr erstellt werden kann (also mach den Konstruktor privat). Dann kann die Adresse nicht mehr geändert werden.</p>
</blockquote>
<p>Äh, aber wie soll ich das Objekt dann erstellen wenn der Konstruktor privat ist? Und parent_ ist doch gar kein unique_ptr sondern ein roher Pointer, das geht dann folglich auch nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435808</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Fri, 02 Jan 2015 19:19:35 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Fri, 02 Jan 2015 20:21:55 GMT]]></title><description><![CDATA[<p>In Zeile 43 kopierst du den parent-Node und zerstörst das Original. Irgendwie habe ich dieses Szenario befürchtet, als du in deinem anderem Thread gefragt hast, was make_shared genau macht. Die vorsichtigen Antworten dort hast du als Freibrief genommen, wild und verständnislos mit Pointern rum zu spielen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435819</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 02 Jan 2015 20:21:55 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Fri, 02 Jan 2015 20:54:50 GMT]]></title><description><![CDATA[<p>node&lt;T&gt; *parent_<br />
und<br />
std::vector&lt;std::shared_ptr&lt;node&lt;T&gt;&gt;&gt; children<br />
passen soweiso nicht zusammen, da die offensichtliche Invariante<br />
this-&gt;children[x]-&gt;parent == this<br />
nicht gelten kann, sobald ein Node von mehreren Knoten bessesen wird. Eigentlich sollten ja alle shared_ptr auf daselbe Objekt äquivalent sein, aber offenbar sind dann manche gleicher als andere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435825</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 02 Jan 2015 20:54:50 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Fri, 02 Jan 2015 21:10:25 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>ok bezüglich des unique_ptr's war ich mir noch unsicher, wegen der Diskussion im oben verlinkten Thread (da gab es ja noch keinen so richtigen Konsens).</p>
<p>tissie schrieb:</p>
<blockquote>
<p>Der Fehler liegt bei</p>
<pre><code class="language-cpp">children.back()-&gt;parent_ = this;
</code></pre>
<p>, weil der node die Adresse ändert, wenn er kopiert wird.</p>
</blockquote>
<p>Ok... aber ich kopiere doch nur den Pointer und nicht das node objekt selbst? Also das führt dann auch zu einer Adress-Änderung?</p>
</blockquote>
<p><code>node</code> verändert nicht seine Adresse, das ist etwas unglücklich formuliert. Was tissie wahrscheinlich meint, ist dass der Kindknoten, den du in <code>make_a_node()</code> zum Elternknoten <code>n</code> hinzufügst, mit der Anweisung <code>return n</code> in einen neuen Knoten (mit anderer Adresse) kopiert wird, und somit dessen parent-Pointer auf nicht mehr auf seinen tatsächlichen Elternknoten verweist sondern auf den mittlerweile nicht mehr existierenden (temporären) Elternknoten <code>n</code> (Stichw. Dangling Pointer).</p>
<p>Mögliche Lösungen wären z.B. ein Copy-Konstruktor, der (rekursiv) die parent-Pointer aller Kindknoten anpasst, oder (meines erachtens sinnvoller) eine <code>make_a_node()</code> -Funktion die einen (Smart-)Pointer zurückgibt, anstatt den gesamten Baum, der an <code>n</code> hängt zu kopieren.</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>tissie schrieb:</p>
<blockquote>
<p>- Mache dir die Besitz-Abhängigkeiten klar. Stelle sicher, dass node nur als unique_ptr erstellt werden kann (also mach den Konstruktor privat). Dann kann die Adresse nicht mehr geändert werden.</p>
</blockquote>
<p>Äh, aber wie soll ich das Objekt dann erstellen wenn der Konstruktor privat ist? Und parent_ ist doch gar kein unique_ptr sondern ein roher Pointer, das geht dann folglich auch nicht?</p>
</blockquote>
<p>Vermutlich will tissie auf so etwas wie eine Factory-Methode hinaus. Wenn du z.B. <code>make_a_node()</code> z.B. zu einer statischen (public-) Methode von <code>node</code> machst (oder <code>make_a_node()</code> als <em>friend</em> deklarierst), kann diese immer noch Knoten erstellen, da sie als Methode von <code>node</code> den privaten Konstruktor aufrufen darf. Das würde ich allerdings auf den ersten Blick nur dann als sinnvoll erachten, wenn du sicherstellen willst, dass neue Knoten nur mit <code>make_a_node()</code> erzeugt werden können (z.B. wenn wie tissie erwähnt hat, Knoten nur als unique_ptr erstellt werden sollen).</p>
<p>Was die Wahl der Smart-Pointer angeht (&quot;Besitzverhältnisse&quot;): Shared Pointer machen eigentlich erst dann Sinn, wenn meherere Objekte &quot;Besitzer&quot; eines anderen sein können (shared ownership). Ich weiss nicht genau, wie du deine Baumstruktur geplant hast, da dein <code>node</code> jedoch nur <strong>einen</strong> parent-Pointer hat, kann ein Knoten höchstens einen Elternknoten haben - oder anders: Es kann für jeden Knoten nur einen einzigen anderen Knoten geben, der auf diesen verweist. Es liegt also eigentlich kein &quot;shared ownership&quot; vor, weshalb es auch Unique-Pointer tun, die weniger Overhead haben. Als Grundstruktur empfiehlt sich also eher so etwas in diese Richtung:</p>
<pre><code>struct node
{
    node* parent;
    vector&lt;unique_ptr&lt;node&gt;&gt; children;

    ...

    unique_ptr&lt;node&gt; make_a_node()
    {
        unique_ptr&lt;node&gt; n(new node());
        n-&gt;add_child(1);
        return n;
    }

    private:
        node() {}
};
</code></pre>
<p>Mir fällt natürlich auch ein Anwendungsfall ein, bei dem die Shared Pointer trotzdem Sinn machen:</p>
<p>Du möchtest z.B. Unterbäume deines Baums in andere Datenstrukturen &quot;einhängen&quot; und die Lebenszeit dieser Datenstrukturen kann die des Baums überdauern. In diesem Fall lohnt es sich sogar eventuell, den parent-Pointer zu einem Weak-Pointer zu machen, damit sich z.B. erkennen lässt, wenn Elternknoten nicht mehr existieren.</p>
<p>Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435830</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Fri, 02 Jan 2015 21:10:25 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Sat, 03 Jan 2015 14:22:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Danke schonmal für die ausführliche Antwort, ich habs jetzt soweit mit unique_ptr hinbekommen und es funktioniert auch (endlich) wie es soll.</p>
<p>Eine Frage hätte ich allerdings noch. Ich hab jetzt den vorgeschlagenen Weg einer statischen, erzeugenden Member-Funktion gewählt, nach diesem Prinzip:</p>
<pre><code>template &lt;typename T&gt;
class node
{
	// ...
public:
	static std::unique_ptr&lt;node&lt;T&gt;&gt; make(T const &amp;data)
	{
		return std::unique_ptr&lt;node&lt;T&gt;&gt;(new node&lt;T&gt;(data));
	}

	// ...
};
</code></pre>
<p>Das kappt jetzt auch soweit. Allerdings hab ich versucht den Aufruf von new durch make_unique zu ersetzen, nämlich so:</p>
<pre><code>return std::make_unique&lt;node&lt;T&gt;&gt;(data); // In Zeile 8 oben
</code></pre>
<p>was ja genauso funktionieren sollte, oder?</p>
<p>Auf jeden Fall geht das nicht, da ich eine Compile-Fehlermeldung erhalte: <em>&quot;cannot access private member declared in class 'node<a href="std::string" rel="nofollow">std::string</a>'&quot;</em>.</p>
<p>was wohl daran liegt dass der Konstruktor jetzt privat ist... Aber wie soll man das umgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435865</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 03 Jan 2015 14:22:36 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Sun, 04 Jan 2015 04:57:01 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>was ja genauso funktionieren sollte, oder?</p>
<p>Auf jeden Fall geht das nicht, da ich eine Compile-Fehlermeldung erhalte: <em>&quot;cannot access private member declared in class 'node<a href="std::string" rel="nofollow">std::string</a>'&quot;</em>.</p>
<p>was wohl daran liegt dass der Konstruktor jetzt privat ist... Aber wie soll man das umgehen?</p>
</blockquote>
<p>Ja, das Problem habe ich auch schon gehabt. Es gibt dafür eine portable Lösung, die allerdings zu etwas umständlicherem Code führt. Ich fasse zuerst nochmal kurz die Motivation hinter dem aktuellen Design zusammen, damit du dir nochmal überlegen kannst, ob du <code>make</code> und/oder <code>make_unique</code> wirklich benötigst:</p>
<p>Warum privater Konstruktor?</p>
<p>Der Konstruktor ist privat um sicherzustellen, dass Instanzen von <code>node</code> ausschließlich durch einen Aufruf von <code>make</code> erstellt werden können. Gründe hierfür können z.B. sein:<br />
- Du möchtest sicherstellen, dass <code>node</code> -Instanzen nur als unique/shared-Pointer erstellt werden können (ist bei dir möglicherweise der Fall).<br />
- Das Erstellen einer neuen Instanz erfordert zusätzlichen Code (z.B. irgendeine Form von Buchführung), der nicht im Konstruktor ausgeführt werden kann/soll.<br />
- Singleton-Entwurfsmuster, bei dem sichergestellt weren soll, dass immer nur eine Instanz der Klasse existiert.</p>
<p>Warum <code>make_unique</code> ?</p>
<p>Im Gegensatz zu <code>make_shared</code> , bei dem der Kontrollblock mit dem Referenzzähler und das Objekt direkt nebeneinander im Speicher erzeugt werden (cache-freundlich), hat <code>make_unique</code> keinen zu erwartenden Performancevorteil.<br />
Allerdings hat <code>make_unique</code> den Vorteil &quot;exception-safe&quot; zu sein, wenn innerhalb eines Ausdrucks an verschiedenen Stellen Exceptions geworfen werden.<br />
Beispiel:</p>
<pre><code>funktion(unique_ptr&lt;T&gt;(new T()), funktionDieExceptionWerfenKann());
</code></pre>
<p>Hier <em>kann</em> der Code in folgender Reihenfolge auswertet werden:</p>
<ol>
<li><code>new T()</code></li>
<li><code>funktionDieExceptionWerfenKann()</code></li>
<li><code>unique_ptr&lt;T&gt;(T*)</code><br />
Wenn nun <code>funktionDieExceptionWerfenKann()</code> eine Exception wirft, dann wird der Speicher, der durch <code>new T()</code> reserviert wurde nicht freigegeben, da der reservierte Speicher noch nicht dem <code>unique_ptr</code> zugewiesen wurde (Speicherleck). Mit <code>make_unique</code> kann das nicht passieren.</li>
</ol>
<p>Bei deinem derzeitigen Code kann das allerdings nicht auftreten, da hier ausschließlich der Konstruktor von <code>T</code> werfen könnte → du kannst vorerst auf <code>make_unique</code> verzichten.</p>
<p>Wenn du dennoch <code>make_unique</code> verwenden möchtest, ist eine Möglichkeit, den Konstruktor zwar <em>public</em> zu machen, ihm aber ein Argument zu geben, dessen Typ wiederum einen privaten Konstruktor hat, der mithilfe einer <em>friend</em>-Deklaration von <code>make</code> aufgerufen werden darf:</p>
<pre><code>template &lt;typename T&gt;
class node
{
    public:
        static std::unique_ptr&lt;node&gt; make(T const&amp; data)
        {
            return std::make_unique&lt;node&gt;(data, construct_via_make());
        }

        class construct_via_make
        {
            // Statische make-Methode ist &quot;friend&quot;, darf also 
            // den Konstruktor construct_via_make() aufrufen.
            friend std::unique_ptr&lt;node&gt; node::make(T const&amp;);
            // Konstruktor ist private (default für &quot;class&quot;).
            construct_via_make() {}
        };

        // Konstruktor ist zwar public, erfordert aber als
        // zweites Argument eine Instanz von construct_via_make,
        // die nur von make() erstellt werden darf (friend).
        node(T const&amp; data, construct_via_make const&amp;) {}
};
</code></pre>
<p>Das ist zwar ein wenig umständlich, aber dafür eine <em>portable</em> Lösung. Man könnte zwar auch naiv erst einmal versuchen <code>make_unique</code> als <em>friend</em> von <code>node</code> zu deklarieren, es gibt allerdings keine Garantie dafür das <code>make_unique</code> auch tatsächlich diejenige Funktion ist, die den Konstruktor von <code>node</code> aufruft (das hängt von der Implementation der Standardbibliothek ab und kann für jeden Compiler anders sein).</p>
<p>Wegen der zusätzlich erzeugten temporären Instanz von `construct_via_make</p>
<p><code>, die in</code>make` erzeugt wird, würde ich mir übrigens performance-technisch keine Sorgen machen. Jeder Compiler, der etwas auf sich hält wird so etwas komplett rausoptimieren.</p>
<p>Gruss,<br />
Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435929</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Sun, 04 Jan 2015 04:57:01 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Sun, 04 Jan 2015 15:24:25 GMT]]></title><description><![CDATA[<p>Ok, alles klar. Mir war nicht bewusst dass <code>make_unique</code> anders als <code>make_shared</code> keinen weiteren Performancevorteil mit sich bringt.</p>
<p>Da es dann hier ja &quot;egal&quot; ist ob <code>make_unique</code> oder direkt der Konstruktor verwendet wird, werd ich dann bei der Lösung mit <code>new</code> bleiben. Danke auf jeden Fall für die Erläuterungen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435975</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 04 Jan 2015 15:24:25 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Sun, 04 Jan 2015 15:39:32 GMT]]></title><description><![CDATA[<p>Au man, so viel Trouble wegen einer kleinen Baumklasse, da sind ja rohe Pointer ein Segen gegen, aber hier werden ja immer die &quot;einfachen&quot; Smartpointer in den Himmel gehoben.</p>
<p>Wenn ich solche Threads lese(und davon gibt es viele) dann vergeht mir schon wieder die Lust am C++ lernen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435979</guid><dc:creator><![CDATA[CppTrouble]]></dc:creator><pubDate>Sun, 04 Jan 2015 15:39:32 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Sun, 04 Jan 2015 15:50:24 GMT]]></title><description><![CDATA[<p>CppTrouble schrieb:</p>
<blockquote>
<p>Au man, so viel Trouble wegen einer kleinen Baumklasse, da sind ja rohe Pointer ein Segen gegen, aber hier werden ja immer die &quot;einfachen&quot; Smartpointer in den Himmel gehoben.</p>
</blockquote>
<p>Och ich denke, dass Leute die Probleme im Umgang mit Smart-Pointern haben, auch auf Probleme mit rohen Pointern stossen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435983</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 04 Jan 2015 15:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Sun, 04 Jan 2015 17:04:56 GMT]]></title><description><![CDATA[<p>CppTrouble schrieb:</p>
<blockquote>
<p>Au man, so viel Trouble wegen einer kleinen Baumklasse, da sind ja rohe Pointer ein Segen gegen, aber hier werden ja immer die &quot;einfachen&quot; Smartpointer in den Himmel gehoben.</p>
<p>Wenn ich solche Threads lese(und davon gibt es viele) dann vergeht mir schon wieder die Lust am C++ lernen.</p>
</blockquote>
<p>Wie theta schon sagte, Probleme gibts auch bei rohen Pointer.</p>
<p>Der Unterschied ist jedoch, dass man bei rohen Pointer die Fehler meist einfach nicht sieht oder bemerkt. Denn ein vergessenes delete, zum Beispiel, wird von niemandem gemeldet und davon abhängig können ganz andere Probleme im kanal untergehen ohne sie jemals zu sehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435990</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 04 Jan 2015 17:04:56 GMT</pubDate></item><item><title><![CDATA[Reply to nullptr auf Stack und 0xCCCCCCCC on Sun, 04 Jan 2015 17:11:57 GMT]]></title><description><![CDATA[<p>CppTrouble schrieb:</p>
<blockquote>
<p>Au man, so viel Trouble wegen einer kleinen Baumklasse, da sind ja rohe Pointer ein Segen gegen, aber hier werden ja immer die &quot;einfachen&quot; Smartpointer in den Himmel gehoben.</p>
</blockquote>
<p>Wenn man nicht weiß, wie man mit einem Hammer umgehen kann und Nägel immer mit einem Stein in die Wand haut, der ist darin so gut, dass er keinen Sinn sieht, bessere Werkzeuge wie Hämmer (ist das der Plural?) zu verwenden.<br />
Wenn man jedoch einmal den Umgang mit einem Hammer gelernt hat, ist man darin wesentlich schneller.</p>
<p>Man muss natürlich lernen mit seinen Werkzeugen umzugehen, bevor man sie schnell einsetzen kann. Und wenn man es kann, sind Smartpointer deutlich einfacher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435993</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 04 Jan 2015 17:11:57 GMT</pubDate></item></channel></rss>