<?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[Frage an unsere Standardophilen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Programm - leider etwas länglich, aber notwendig um das Problem zu reproduzieren, aber es wäre trotzdem schön wenn ihr mal drüber schaut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Main.cpp</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;
int main()
{
  A a;
  return 0;
}
</code></pre>
<p>A.h</p>
<pre><code class="language-cpp">#ifndef AH
#define AH

#include &lt;memory&gt;

class AImpl;

class A
{
public:
  A();
  A( const A&amp;);
  A&amp; operator=( const A&amp;);
  ~A();
private:
  std::auto_ptr&lt;AImpl&gt; impl_;
};

#endif
</code></pre>
<p>A.cpp</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;

#include &lt;algorithm&gt;
#include &lt;iostream&gt;

#include &quot;B.h&quot;

using namespace std;

A::A()
: impl_( new AImpl)
{
  cout &lt;&lt; &quot;A create&quot; &lt;&lt; endl;
}

A::A( const A&amp; other)
: impl_( new AImpl( *other.impl_.get()))
{
  cout &lt;&lt; &quot;A copy&quot; &lt;&lt; endl;
}

A&amp; A::operator=( const A&amp; other)
{
  cout &lt;&lt; &quot;A assign&quot; &lt;&lt; endl;
  A tmp( other);
  swap( impl_, tmp.impl_);
  return *this;
}

A::~A()
{
  cout &lt;&lt; &quot;A destroy&quot; &lt;&lt; endl;
}
</code></pre>
<p>B.h</p>
<pre><code class="language-cpp">#ifndef BH
#define BH

#include &lt;memory&gt;

class BImpl;

class AImpl
{
public:
  AImpl();
  AImpl( const AImpl&amp;);
  AImpl&amp; operator=( const AImpl&amp;);
  ~AImpl();
private:
  std::auto_ptr&lt;BImpl&gt; impl_;
};

#endif
</code></pre>
<p>B.cpp</p>
<pre><code class="language-cpp">#include &quot;B.h&quot;

#include &lt;algorithm&gt;
#include &lt;iostream&gt;
using namespace std;

class BImpl
{
public:
  BImpl()                         { cout &lt;&lt; &quot;BImpl create&quot; &lt;&lt; endl; }
  BImpl( const BImpl&amp;)            { cout &lt;&lt; &quot;BImpl copy&quot; &lt;&lt; endl; }
  ~BImpl()                        { cout &lt;&lt; &quot;BImpl destroy&quot; &lt;&lt; endl; }
  BImpl&amp; operator=( const BImpl&amp;) { cout &lt;&lt; &quot;BImpl assign&quot; &lt;&lt; endl;  return *this; }
};

AImpl::AImpl()
: impl_( new BImpl)
{
  cout &lt;&lt; &quot;AImpl create&quot; &lt;&lt; endl;
}

AImpl::AImpl( const AImpl&amp; other)
: impl_( new BImpl( *other.impl_.get()))
{
  cout &lt;&lt; &quot;AImpl copy&quot; &lt;&lt; endl;
}

AImpl&amp; AImpl::operator=( const AImpl&amp; other)
{
  cout &lt;&lt; &quot;AImpl assign&quot; &lt;&lt; endl;
  AImpl tmp( other);
  swap( impl_, tmp.impl_);
  return *this;
}

AImpl::~AImpl()
{
  cout &lt;&lt; &quot;AImpl destroy&quot; &lt;&lt; endl;
}
</code></pre>
<p>Welchen Output sollte das Programm eurer Meinung nach produzieren, bzw. welchen produziert es (dann wäre Compiler inkl. Version interessant)?</p>
<p>Welche Freiheiten hat der Compiler, Kopien etc zu entfernen, zu inlinenen usw.?</p>
<p>Bitte keine Diskussion über Sinn und Unsinn <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /> Hintergrund ist jener: Der Borland C++ Compiler 2007 spuckt folgendes aus:</p>
<blockquote>
<p>BImpl create<br />
AImpl create<br />
A create<br />
A destroy<br />
AImpl destroy</p>
</blockquote>
<p>BImpl wird <em>nicht</em> zerstört. Im Singlestep wird zwar der Destruktor von auto_ptr&lt;BImpl&gt; angelaufen und auch ein delete gemacht, aber das ruft den Destruktor von BImpl nicht auf, was wiederum eigentlich nur heißen kann, dass die Definition von BImpl an dieser Stelle nicht bekannt wäre.<br />
Verstehe ich nicht... kann eigentlich nur heißen, nicht standardkonform oder Compilerbug <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217703/frage-an-unsere-standardophilen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 12:32:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217703.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Jul 2008 09:00:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Thu, 10 Jul 2008 09:00:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Programm - leider etwas länglich, aber notwendig um das Problem zu reproduzieren, aber es wäre trotzdem schön wenn ihr mal drüber schaut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Main.cpp</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;
int main()
{
  A a;
  return 0;
}
</code></pre>
<p>A.h</p>
<pre><code class="language-cpp">#ifndef AH
#define AH

#include &lt;memory&gt;

class AImpl;

class A
{
public:
  A();
  A( const A&amp;);
  A&amp; operator=( const A&amp;);
  ~A();
private:
  std::auto_ptr&lt;AImpl&gt; impl_;
};

#endif
</code></pre>
<p>A.cpp</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;

#include &lt;algorithm&gt;
#include &lt;iostream&gt;

#include &quot;B.h&quot;

using namespace std;

A::A()
: impl_( new AImpl)
{
  cout &lt;&lt; &quot;A create&quot; &lt;&lt; endl;
}

A::A( const A&amp; other)
: impl_( new AImpl( *other.impl_.get()))
{
  cout &lt;&lt; &quot;A copy&quot; &lt;&lt; endl;
}

A&amp; A::operator=( const A&amp; other)
{
  cout &lt;&lt; &quot;A assign&quot; &lt;&lt; endl;
  A tmp( other);
  swap( impl_, tmp.impl_);
  return *this;
}

A::~A()
{
  cout &lt;&lt; &quot;A destroy&quot; &lt;&lt; endl;
}
</code></pre>
<p>B.h</p>
<pre><code class="language-cpp">#ifndef BH
#define BH

#include &lt;memory&gt;

class BImpl;

class AImpl
{
public:
  AImpl();
  AImpl( const AImpl&amp;);
  AImpl&amp; operator=( const AImpl&amp;);
  ~AImpl();
private:
  std::auto_ptr&lt;BImpl&gt; impl_;
};

#endif
</code></pre>
<p>B.cpp</p>
<pre><code class="language-cpp">#include &quot;B.h&quot;

#include &lt;algorithm&gt;
#include &lt;iostream&gt;
using namespace std;

class BImpl
{
public:
  BImpl()                         { cout &lt;&lt; &quot;BImpl create&quot; &lt;&lt; endl; }
  BImpl( const BImpl&amp;)            { cout &lt;&lt; &quot;BImpl copy&quot; &lt;&lt; endl; }
  ~BImpl()                        { cout &lt;&lt; &quot;BImpl destroy&quot; &lt;&lt; endl; }
  BImpl&amp; operator=( const BImpl&amp;) { cout &lt;&lt; &quot;BImpl assign&quot; &lt;&lt; endl;  return *this; }
};

AImpl::AImpl()
: impl_( new BImpl)
{
  cout &lt;&lt; &quot;AImpl create&quot; &lt;&lt; endl;
}

AImpl::AImpl( const AImpl&amp; other)
: impl_( new BImpl( *other.impl_.get()))
{
  cout &lt;&lt; &quot;AImpl copy&quot; &lt;&lt; endl;
}

AImpl&amp; AImpl::operator=( const AImpl&amp; other)
{
  cout &lt;&lt; &quot;AImpl assign&quot; &lt;&lt; endl;
  AImpl tmp( other);
  swap( impl_, tmp.impl_);
  return *this;
}

AImpl::~AImpl()
{
  cout &lt;&lt; &quot;AImpl destroy&quot; &lt;&lt; endl;
}
</code></pre>
<p>Welchen Output sollte das Programm eurer Meinung nach produzieren, bzw. welchen produziert es (dann wäre Compiler inkl. Version interessant)?</p>
<p>Welche Freiheiten hat der Compiler, Kopien etc zu entfernen, zu inlinenen usw.?</p>
<p>Bitte keine Diskussion über Sinn und Unsinn <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /> Hintergrund ist jener: Der Borland C++ Compiler 2007 spuckt folgendes aus:</p>
<blockquote>
<p>BImpl create<br />
AImpl create<br />
A create<br />
A destroy<br />
AImpl destroy</p>
</blockquote>
<p>BImpl wird <em>nicht</em> zerstört. Im Singlestep wird zwar der Destruktor von auto_ptr&lt;BImpl&gt; angelaufen und auch ein delete gemacht, aber das ruft den Destruktor von BImpl nicht auf, was wiederum eigentlich nur heißen kann, dass die Definition von BImpl an dieser Stelle nicht bekannt wäre.<br />
Verstehe ich nicht... kann eigentlich nur heißen, nicht standardkonform oder Compilerbug <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544797</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Thu, 10 Jul 2008 09:00:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Thu, 10 Jul 2008 11:01:46 GMT]]></title><description><![CDATA[<p>So, ich habe gerade auch mal dieses hier vom Herrn Sutter wiedergefunden:<br />
<a href="http://www.gotw.ca/publications/using_auto_ptr_effectively.htm" rel="nofollow">http://www.gotw.ca/publications/using_auto_ptr_effectively.htm</a></p>
<p>Da implementiert er ein Pimpl genauso - behauptet sogar, dass man den Destruktor weglassen kann, was ich wiederum bezweifele, da wenn der Destruktor nun implizit inline generiert wird, der auto_ptr die Definition des PImpls nicht kennen kann.<br />
Da aber in obigem Beispiel der Destruktor ja eh im .cpp liegt, sollte selbst dieses potenzielle Problem umgangen sein. Ich habe es übrigens sogar schon ausprobiert, den Destruktor virtuell zu machen etc.<br />
Inlining ist vollständig deaktiviert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544902</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Thu, 10 Jul 2008 11:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Thu, 10 Jul 2008 11:13:33 GMT]]></title><description><![CDATA[<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>So, ich habe gerade auch mal dieses hier vom Herrn Sutter wiedergefunden:<br />
<a href="http://www.gotw.ca/publications/using_auto_ptr_effectively.htm" rel="nofollow">http://www.gotw.ca/publications/using_auto_ptr_effectively.htm</a></p>
<p>Da implementiert er ein Pimpl genauso - behauptet sogar, dass man den Destruktor weglassen kann, was ich wiederum bezweifele, da wenn der Destruktor nun implizit inline generiert wird, der auto_ptr die Definition des PImpls nicht kennen kann.<br />
Da aber in obigem Beispiel der Destruktor ja eh im .cpp liegt, sollte selbst dieses potenzielle Problem umgangen sein. Ich habe es übrigens sogar schon ausprobiert, den Destruktor virtuell zu machen etc.<br />
Inlining ist vollständig deaktiviert.</p>
</blockquote>
<p>Mein g++ heißt:</p>
<pre><code>gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
</code></pre>
<p>Und dein Programm sagt dann:</p>
<pre><code>$ ./AB
BImpl create
AImpl create
A create
A destroy
AImpl destroy
BImpl destroy
</code></pre>
<p>Und so sollte es IMHO wohl auch sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544913</guid><dc:creator><![CDATA[bladerunner10]]></dc:creator><pubDate>Thu, 10 Jul 2008 11:13:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Thu, 10 Jul 2008 12:00:24 GMT]]></title><description><![CDATA[<p>Das ganze ist undefiniert wegen 17.4.3.6/2 letzter Fall</p>
<blockquote>
<p>In particular, the effects are undefined in the following cases:<br />
...<br />
— if an incomplete type (3.9) is used as a template argument when instantiating a template component.</p>
</blockquote>
<p>Die Verwendung eines anderen Smartpointers, der ausdrücklich auch bei der Zerstörung korrekt mit unvollständigen Templateargumenten umgehen kann (etwa: shared_ptr; z.B. nicht: scoped_ptr), kann dieses Problem lösen. Allgemeingültiger dürfte allerdings die explizite Deklaration und Definition (nicht inline) des Destruktors sein. Bei pimpl wird man in der Regel ja sowieso die großen Drei definieren müssen. Wenn man das tut, ist an dieser Stelle ein nackter Zeiger ausnahmsweise mal sinnvoller. Persönlich denke ich ja - das wird aber sicher auf Widerspruch treffen - dass void* der beste Typ für pimpl ist, nur damit wird die Implementation vollständig entkoppelt. Bei Impl* ist Impl zumindest immer noch eine Klasse mit external linkage, man kann sie also z.B. nicht mal eben umbenennen oder in einen privaten Namensraum verschieben etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544957</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 10 Jul 2008 12:00:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Thu, 10 Jul 2008 11:57:42 GMT]]></title><description><![CDATA[<p>Bin ich blind, oder hat der OP _alle_ Destruktoren dekalriert !?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544963</guid><dc:creator><![CDATA[bladerunner10]]></dc:creator><pubDate>Thu, 10 Jul 2008 11:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Thu, 10 Jul 2008 12:02:48 GMT]]></title><description><![CDATA[<p>bladerunner10 schrieb:</p>
<blockquote>
<p>Bin ich blind, oder hat der OP _alle_ Destruktoren dekalriert !?</p>
</blockquote>
<p>Nicht bevor die jeweiligen auto_ptr-Objekte definiert wurden. Danach ist es zu spät.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544972</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 10 Jul 2008 12:02:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Thu, 10 Jul 2008 12:37:52 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>bladerunner10 schrieb:</p>
<blockquote>
<p>Bin ich blind, oder hat der OP _alle_ Destruktoren dekalriert !?</p>
</blockquote>
<p>Nicht bevor die jeweiligen auto_ptr-Objekte definiert wurden. Danach ist es zu spät.</p>
</blockquote>
<p>Die Destruktoren sind doch vor den auto_ptr's deklariert, und sind alle ausdrücklich deklariert und nicht inline. Oder verstehe ich dich falsch? (oder meinst du die Destruktoren der Impls in Bezug auf den auto_ptr in der besitzenden Klasse?)</p>
<p>Kann hier evtl. noch der Wechsel der Sichtbarkeit in die Quere? &quot;Reihenfolgen&quot; waren doch IIRC nur innerhalb eines Sichtbarkeitsbereichs festgelegt.</p>
<p>Würde in Folgerung dann auch bedeuten, dass das Beispiel von Sutter undefiniertes Verhalten ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544996</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Thu, 10 Jul 2008 12:37:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Thu, 10 Jul 2008 12:44:24 GMT]]></title><description><![CDATA[<p>Betrachte zum Beispiel (die anderen analog)</p>
<pre><code class="language-cpp">#ifndef AH
#define AH

#include &lt;memory&gt;

class AImpl;

class A
{
public:
  A();
  A( const A&amp;);
  A&amp; operator=( const A&amp;);
  ~A();
private:
  std::auto_ptr&lt;AImpl&gt; impl_;
};

#endif
</code></pre>
<p>AImpl ist hier bei der Definition von A::impl_ ein unvollständiger Typ. Da dies eine Definition ist, führt es zur Instantiierung von std::auto_ptr&lt;AImpl&gt; an dieser Stelle. Das ist, wie ausgeführt, undefiniert. Die Tatsache, dass der Destruktor von A hier explizit deklariert wird, dürfte in vielen Fällen dafür sorgen, dass das Programm in der Praxis doch noch das tut, was wir naiv erwarten. Andererseits halte ich wenig von Konstruktionen, die so fragil sind, dass sie durch bloße inline-Definition einer Funktion (~A) im Header (verletzt dann die ODR) kaputt gehen würden. Und ja, das heißt auch, dass Sutter hier irrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1545013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1545013</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 10 Jul 2008 12:44:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Thu, 10 Jul 2008 12:47:16 GMT]]></title><description><![CDATA[<p>Okay, danke, ist mir dann klar denke ich. Ziemlich dreckige Falle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Ich werde mir wohl mal die Implementierung von shared_ptr zu Gemüte führen, das interessiert mich mal wie die das mit unvollständigen Typinformationen hinbekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1545015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1545015</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Thu, 10 Jul 2008 12:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Fri, 18 Jul 2008 11:13:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin mir der derzeitigen Antwort noch nicht ganz zufrieden.</p>
<p>Okay, std::auto_ptr hat gemäß C++ Standard per Definition ein undefiniertes Verhalten für unvollständige Typen.</p>
<p>Nach etwas weiterführender Lektüre in comp.lang.c++.moderated riecht hier immernoch alles nach Compilerbug.</p>
<p>Ersetzen wir in obigem Beispiel mal std::auto_ptr durch eine eigene Klasse (nur als sinnhaftes Beispiel, nicht als voll compilierfähiges und einsatzfähiges Beispiel):</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class MyAutoPtr : public noncopyable
{
private:
  T* t_;
public:
  explicit MyAutoPtr( T* t) : t_( t) {}
  ~MyAutoPtr() { delete t_; }
}
</code></pre>
<p>Und dann folgende Klasse:</p>
<p>A.h</p>
<pre><code class="language-cpp">#include &quot;MyAutoPtr.h&quot;
class A : public noncopyable
{
public:
  A();
  ~A()
private:
  class AImpl;
  MyAutoPtr&lt;AImpl&gt; impl_;
}
</code></pre>
<p>A.cpp</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;

class A::AImpl {};
A::A() : impl_( new AImpl)
A::~A() {}
</code></pre>
<p>Dieser Code sollte doch konform sein, oder?</p>
<p>Der Destruktor von MyAutpPtr&lt;AImpl&gt; <strong>muss</strong> doch jetzt in A::~A im Cpp-File instanziiert werden, oder nicht (und damit eben an einer Stelle, an der AImpl kein unvollständiger Typ mehr ist)?</p>
<p>Da ich weiß (durch nachschauen in der Implementierung), dass std::auto_ptr für meine ganz konkrete Implementierung mit einem T* t als Member und einem delete t im Destruktor implementiert ist (bzw void* mit cast im Destruktor und damit gleichwertig zu meinem Beispiel sein sollte), sollte hier ein Fehler im Compiler vorliegen? Bevor sich jemand beschwert - ich könnte auch einfach die Implementierung aus den Headern rauskopieren, umbenennen und dann benutzen - damit wäre die Restriktion des Standards &quot;egal&quot; und nur noch der oben erwähnte Code inkraft.</p>
<p>Über Angaben zu entsprechenden Passagen im Standard für ein für und wider würde ich mich freuen.</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549259</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 18 Jul 2008 11:13:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Fri, 18 Jul 2008 11:39:05 GMT]]></title><description><![CDATA[<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>Dieser Code sollte doch konform sein, oder?</p>
</blockquote>
<p>Mir fällt nichts gegenteiliges auf.</p>
<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>Der Destruktor von MyAutpPtr&lt;AImpl&gt; <strong>muss</strong> doch jetzt in A::~A im Cpp-File instanziiert werden, oder nicht (und damit eben an einer Stelle, an der AImpl kein unvollständiger Typ mehr ist)?</p>
</blockquote>
<p>Ja. Ein Problem könnte allerdings im Prinzip entstehen, falls der Destruktor von MyAutpPtr&lt;AImpl&gt; an irgendeiner anderen Stelle des Programmes (an der AImpl nicht vollständig definiert ist) instantiiert wird (aus welchem Grunde auch immer). Dann liegt ggf. eine ODR-Verletzung vor und wird wissen nicht, welche Version im Destruktor von A aufgerufen werden wird. Am Besten führt man immer eine Prüfung hinsichtlich der vollständigen Definition vor dem Löschen aus. Boosts Smartpointer z.B. benutzen in der Regel checked_delete - ein Versuch, die Destruktoren zu instantiieren, wenn das Templateargument unvollständig ist, führt also direkt zu einem Fehler beim Compilieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549324</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 18 Jul 2008 11:39:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Fri, 18 Jul 2008 12:14:24 GMT]]></title><description><![CDATA[<p>Danke, das mit der ODR-Verletzung ist mir jetzt auch nochmal wirklich klar geworden. Ich frage mich, warum der Linker trotz aller Warnungen und Verbose-Flag im ursprünglichen Beispiel nicht gemeckert hat.<br />
Edit: Okay, kann er eigentlich nicht, bzw. allenfalls möglich, wenn kein inlining stattgefunden hat und er die weak symbols inhaltlich vergleichen würde. Das ist wohl verzeihbar... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>camper schrieb:</p>
<blockquote>
<p>Ein Problem könnte allerdings im Prinzip entstehen, falls der Destruktor von MyAutpPtr&lt;AImpl&gt; an irgendeiner anderen Stelle des Programmes (an der AImpl nicht vollständig definiert ist) instantiiert wird (aus welchem Grunde auch immer).</p>
</blockquote>
<p>Was für Gründe können das denn sein? Was ich mich frage ist, ob du damit völlig legale Gründe meinst wo das passieren kann (also so, wie der Code zuletzt in meinem Beispiel stand), oder auf unsaubere Benutzung des MyAutoPtr&lt;AImpl&gt;-Konstrukt abzielst. Letzteres wäre mir klar, aber wenn dir zu ersterem etwas einfällt, wäre ich neugierig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549343</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 18 Jul 2008 12:14:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Fri, 18 Jul 2008 13:22:44 GMT]]></title><description><![CDATA[<p>Was du tust entspricht zusammengefasst, ohne die ganzen Klassen, dem hier:</p>
<pre><code class="language-cpp">class Impl;
Impl* ptr = 0;
delete ptr; // destructor ~Impl() is undefined =&gt; undefined behaviour.
</code></pre>
<p>Du versuchst eine nicht definierte Klasse zu 'deleten'. Das führt - wie von camper erwähnt - zu undefiniertem Verhalten. Beim MSVC kann es zB dazu kommen, dass der Destruktor gar nicht aufgerufen wird (sowas in der Art wird bei dir passiert sein).<br />
Der MSVC warnt:</p>
<pre><code>warning C4150: deletion of pointer to incomplete type 'main::Impl'; no destructor called
</code></pre>
<p>Das ist kein Compilerbug, sondern ein ganz normaler Programmiererbug.</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549407</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Fri, 18 Jul 2008 13:22:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Fri, 18 Jul 2008 14:08:44 GMT]]></title><description><![CDATA[<p>Don06 schrieb:</p>
<blockquote>
<p>Was du tust entspricht zusammengefasst, ohne die ganzen Klassen, dem hier:</p>
<pre><code class="language-cpp">class Impl;
Impl* ptr = 0;
delete ptr; // destructor ~Impl() is undefined =&gt; undefined behaviour.
</code></pre>
<p>Du versuchst eine nicht definierte Klasse zu 'deleten'. Das führt - wie von camper erwähnt - zu undefiniertem Verhalten.</p>
</blockquote>
<p>Nur dann, wenn der Destruktor von Impl nicht trivial ist (das wird für solche Impl-Klassen wohl in der Regel zutreffen) oder der delete-Operator für diese Klasse überladen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549431</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 18 Jul 2008 14:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an unsere Standardophilen on Fri, 18 Jul 2008 14:22:15 GMT]]></title><description><![CDATA[<p>Don06 schrieb:</p>
<blockquote>
<p>Das ist kein Compilerbug, sondern ein ganz normaler Programmiererbug.</p>
</blockquote>
<p>Hast du den gesamten Thread gelesen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Es geht mir dadrum, wenn der explizit geschrieben ist und im .cpp-File steht und somit der Code eigentlich konform sein sollte, aber im RAD-Studio 2007 anscheinend trotzalledem nicht aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549440</guid><dc:creator><![CDATA[7H3 N4C3R off]]></dc:creator><pubDate>Fri, 18 Jul 2008 14:22:15 GMT</pubDate></item></channel></rss>