<?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[auto_ptr und stackobjektzuweisung gültig?]]></title><description><![CDATA[<p>Hi!</p>
<p>Ist dies gültig oder undefiniert?</p>
<pre><code class="language-cpp">int main()
{	
	int x = 3;
	int* intPtr = &amp;x;

	// Kann auch mal vorkommen...
	// int* intPtr = new int(3);

	{
		std::auto_ptr&lt;int&gt; autoPrt(intPtr);
	}
}
</code></pre>
<p>Funktioniert soweit nämlich prima!<br />
Problem ist, dass ich nicht weiß ob ein Objekt am stack (ohne new) oder am heap (mit new) erstellt wurde. Der autoPtr soll dann gegebenfalls ein delete ausführen, FALLS per new erstellt wurde.</p>
<p>Ist das so zulässig?<br />
Andere Lösung?</p>
<p>Danke schonmal!<br />
Bronson</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/226665/auto_ptr-und-stackobjektzuweisung-gültig</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 18:59:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226665.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Nov 2008 13:41:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 13:41:23 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ist dies gültig oder undefiniert?</p>
<pre><code class="language-cpp">int main()
{	
	int x = 3;
	int* intPtr = &amp;x;

	// Kann auch mal vorkommen...
	// int* intPtr = new int(3);

	{
		std::auto_ptr&lt;int&gt; autoPrt(intPtr);
	}
}
</code></pre>
<p>Funktioniert soweit nämlich prima!<br />
Problem ist, dass ich nicht weiß ob ein Objekt am stack (ohne new) oder am heap (mit new) erstellt wurde. Der autoPtr soll dann gegebenfalls ein delete ausführen, FALLS per new erstellt wurde.</p>
<p>Ist das so zulässig?<br />
Andere Lösung?</p>
<p>Danke schonmal!<br />
Bronson</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610004</guid><dc:creator><![CDATA[Bronson]]></dc:creator><pubDate>Tue, 04 Nov 2008 13:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 13:43:11 GMT]]></title><description><![CDATA[<p>Bronson schrieb:</p>
<blockquote>
<p>Ist dies gültig oder undefiniert?</p>
</blockquote>
<p>Undefiniert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610006</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 04 Nov 2008 13:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 13:47:03 GMT]]></title><description><![CDATA[<p>Bronson schrieb:</p>
<blockquote>
<p>Funktioniert soweit nämlich prima!<br />
Problem ist, dass ich nicht weiß ob ein Objekt am stack (ohne new) oder am heap (mit new) erstellt wurde. Der autoPtr soll dann gegebenfalls ein delete ausführen, FALLS per new erstellt wurde.</p>
</blockquote>
<p>Wie sieht denn das Problem aus? Normalerweise weiss man schon selbst, ob man Heap- oder Stack-Objekte hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610009</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 04 Nov 2008 13:47:03 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 13:50:24 GMT]]></title><description><![CDATA[<p>Mist, dacht ich mir!<br />
Eine Zuweisung geht auch nicht, wie soll man da flexibel sein?</p>
<pre><code class="language-cpp">int main()
{	
	int x = 7;

	// Pointer könnte 0 sein, oder aber auf ein Stackobjekt zeigen
	// int* intPtr = &amp;x;
	int* intPtr = 0;

	std::auto_ptr&lt;int&gt; autoPtr;

	if(!intPtr)
	{
		intPtr = new int(3);
		//autoPtr = intPtr; // Geht ja nicht...
	}

	// In jedem Fall soll hier ein Objekt dahinterstecken und dann automatisch gelöscht werden
	cout &lt;&lt; *intPtr;
}
</code></pre>
<p>Wenn intPtr 0 ist, wird ein neues Heapobjekt erstellt, ansonsten zeigt intPtr schon auf ein Objekt, aber am Stack!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610014</guid><dc:creator><![CDATA[Bronson]]></dc:creator><pubDate>Tue, 04 Nov 2008 13:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 13:52:28 GMT]]></title><description><![CDATA[<p>Mir leuchtet der Sinn nicht ein. Wenn Du ein Stack-Objekt anlegst, dann <em>hast</em> Du auch ein Stack-Objekt. Wozu dann noch ein Heap-Objekt bedingt anlegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610015</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 04 Nov 2008 13:52:28 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 13:53:46 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Normalerweise weiss man schon selbst, ob man Heap- oder Stack-Objekte hat.</p>
</blockquote>
<p>Und wenn man es nicht weiss, gibt es keinen zuverlässigen Weg, es herauszufinden. Wenn die Rekonstruktion schwierig ist, muss man halt darauf achten, dass man zusätzlich irgendwo Information darüber abspeichert, ob Heap oder Stack als Speicherplatz dient.</p>
<p>Aber eigentlich vollkommen unnötig, da man es wie gesagt wissen sollte - andernfalls hat man mit hoher Wahrscheinlichkeit etwas falsch gemacht...</p>
<p>Bronson schrieb:</p>
<blockquote>
<p>wie soll man da flexibel sein?</p>
</blockquote>
<p>Entweder Konsistenz hineinbringen oder halt eine <code>bool</code> -Variable verwenden, wobei Letzeres weder schön ist noch von gutem Stil zeugt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610016</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Nov 2008 13:53:46 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 13:53:27 GMT]]></title><description><![CDATA[<p>Wäre interessant zu wissen, was dein genaues Problem ist, dann könnte man dir Alternativen Vorschlagen? Vielleicht Funktionsüberladung?</p>
<pre><code class="language-cpp">foo(int* p)
{
  // ...
}

foo(std::auto_ptr&lt;int&gt; p)
{
  foo(p.get());
}

int main()
{
  int x;
  foo(&amp;x);

  std::auto_ptr&lt;int&gt; p(new int(3));
  foo(p);

  return 0;
}
</code></pre>
<p>*Grad noch die Vorschau gesehen hat*<br />
Doch eine Zuweisung geht, man muss sie nur explicit angeben:</p>
<pre><code class="language-cpp">intPtr = std::auto_ptr&lt;int&gt;(new int(3));
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610017</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 04 Nov 2008 13:53:27 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:03:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a><br />
Ich meinte die Zuweisung aber umgekehrt.</p>
<p>Ach, ich poste mal den eigentlichen Code:</p>
<pre><code class="language-cpp">void OutputTime(SYSTEMTIME* time = 0)
{
	if(!time)
	{
		time = new SYSTEMTIME();
		GetLocalTime(time);
	}

	// Wer löscht?

	cout &lt;&lt; time-&gt;wHour;
}

int main()
{	
	OutputTime(); // Soll aktuelle Zeit zeigen

	SYSTEMTIME customTime = { 0, 0, 0, 0, 4 };
	OutputTime(&amp;customTime); // Soll eigene Zeit zeigen
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1610024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610024</guid><dc:creator><![CDATA[Bronson]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:03:42 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:07:54 GMT]]></title><description><![CDATA[<p>Ich sagte ja, du solltest dir das speichern. Liest du meine Beiträge eigentlich auch? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<pre><code class="language-cpp">void OutputTime(SYSTEMTIME* time = 0)
{
    bool OnHeap;
    if(!time)
    {
        time = new SYSTEMTIME();
        GetLocalTime(time);
        OnHeap = true;
    }
    else
    {
        OnHeap = false;
    }

    if (OnHeap)
    {
        delete time;
    }

    cout &lt;&lt; time-&gt;wHour;
}
</code></pre>
<p>Wahrscheinlich gibt es von Grund auf sauberere Lösungen, aber das kann ich wegen zu wenig Kontext nicht genau sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610026</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:07:54 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:10:15 GMT]]></title><description><![CDATA[<p>Tja, genau das hatte ich von Anfang an... eine bool Variable.<br />
Wollte eben versuchen es doch &quot;schöner&quot; zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610028</guid><dc:creator><![CDATA[Bronson]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:10:15 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:13:36 GMT]]></title><description><![CDATA[<p>Ich würde das, wie Dravere gesagt hat, mit Überladung lösen:</p>
<pre><code class="language-cpp">void OutputTime()
{
    SYSTEMTIME time;
    GetLocalTime(&amp;time); 
    cout &lt;&lt; time.wHour; 
}

void OutputTime(const SYSTEMTIME &amp;time)
{
    cout &lt;&lt; time.wHour; 
}

int main()
{	
	OutputTime(); // zeigt aktuelle Zeit an

	SYSTEMTIME customTime = { 0, 0, 0, 0, 4 };
	OutputTime(customTime); // zeigt eigene Zeit an
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1610029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610029</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:12:25 GMT]]></title><description><![CDATA[<p>Da wäre, wie von Dravere bereits angetönt, Überladung etwas. Du definierst zwei Funktionen, wovon eine keine Parameter und die andere einen vom Typ <code>SYSTEMTIME*</code> hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610030</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:12:25 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:14:44 GMT]]></title><description><![CDATA[<p>Ja, okay. Dachte es geht &quot;schöner&quot; (Ohne doppelten Code).<br />
Danke jedenfalls!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610032</guid><dc:creator><![CDATA[Bronson]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:14:44 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:16:26 GMT]]></title><description><![CDATA[<p>Bronson schrieb:</p>
<blockquote>
<p>Ja, okay. Dachte es geht &quot;schöner&quot; (Ohne doppelten Code).</p>
</blockquote>
<p>Du hast keinen doppelten Code. Falls innerhalb der beiden Funktionen das Gleiche gemacht wird (unabhängig von Speicherverwaltung), kannst du ja eine dritte Funktion definieren, die von beiden anderen aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610035</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:16:26 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:20:23 GMT]]></title><description><![CDATA[<p>Okay drei Funktionen, statt einer.<br />
Naja was solls...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610037</guid><dc:creator><![CDATA[Bronson]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:20:23 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:23:46 GMT]]></title><description><![CDATA[<p>Bronson schrieb:</p>
<blockquote>
<p>Okay drei Funktionen, statt einer.</p>
</blockquote>
<p>Was stört dich daran? Wenn man nicht weiss, ob ein Objekt auf dem Stack oder Heap erstellt wird, kann man das auch nicht in einer Zeile schnell richten. Zudem werden die Funktionen kaum gross sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610039</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:23:46 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:25:26 GMT]]></title><description><![CDATA[<p>Ja stimmt, die drei Funktionen nehmen nun etwa genauso viele Zeilen ein wie die eine Große zuvor.</p>
<p>THX <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/1610040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610040</guid><dc:creator><![CDATA[Bronson]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:25:26 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:39:25 GMT]]></title><description><![CDATA[<p>Wieso 3 Funktionen?<br />
Mit dem Beispiel von Tachyon:</p>
<pre><code class="language-cpp">void OutputTime() 
{ 
    SYSTEMTIME time; 
    GetLocalTime(&amp;time);
    OutputTime(time); // &lt;- Hier kannst du die zweite Funktion aufrufen!
} 

void OutputTime(const SYSTEMTIME &amp;time) 
{ 
    cout &lt;&lt; time.wHour; 
} 

int main() 
{    
    OutputTime(); // zeigt aktuelle Zeit an 

    SYSTEMTIME customTime = { 0, 0, 0, 0, 4 }; 
    OutputTime(customTime); // zeigt eigene Zeit an 
}
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610051</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 14:42:59 GMT]]></title><description><![CDATA[<p>Bronson schrieb:</p>
<blockquote>
<p>Mist, dacht ich mir!<br />
Eine Zuweisung geht auch nicht, wie soll man da flexibel sein?</p>
<pre><code class="language-cpp">int main()
{	
	int x = 7;

	// Pointer könnte 0 sein, oder aber auf ein Stackobjekt zeigen
	// int* intPtr = &amp;x;
	int* intPtr = 0;

	std::auto_ptr&lt;int&gt; autoPtr;

	if(!intPtr)
	{
		intPtr = new int(3);
		//autoPtr = intPtr; // Geht ja nicht...
	}

	// In jedem Fall soll hier ein Objekt dahinterstecken und dann automatisch gelöscht werden
	cout &lt;&lt; *intPtr;
}
</code></pre>
<p>Wenn intPtr 0 ist, wird ein neues Heapobjekt erstellt, ansonsten zeigt intPtr schon auf ein Objekt, aber am Stack!</p>
</blockquote>
<p>Klar geht eine Zuweisung, du musst nur richtig zuweisen:</p>
<pre><code class="language-cpp">int* intPtr = 0;

	std::auto_ptr&lt;int&gt; autoPtr;

	if(!intPtr)
	{
		intPtr = new int(3);
		autoPtr = std::auto_ptr&lt;int&gt;(intPtr); // geht wohl
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1610054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610054</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 04 Nov 2008 14:42:59 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr und stackobjektzuweisung gültig? on Tue, 04 Nov 2008 15:48:27 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a><br />
Oh stimmt, viel eleganter.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a><br />
Oh, also wäre mein eigentliches Vorhaben mit dem auto_ptr eigentlich kein Problem gewesen (Wenn per new angelegt wird, bekommt der auto_ptr das Objekt auch zugewiesen und löscht somit dann ja automatisch...)</p>
<p>Naja nun hab ich halt die Funktion überladen.</p>
<p>Danke nochmals an alle!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1610107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1610107</guid><dc:creator><![CDATA[Bronson]]></dc:creator><pubDate>Tue, 04 Nov 2008 15:48:27 GMT</pubDate></item></channel></rss>