<?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[Zeiger sicher verwenden?]]></title><description><![CDATA[<p>Hi</p>
<p>Habe in einer Klasse einen Zeiger, den ich aber auf jedenfall freigeben möchte. Was haltet ihr von folgendem Vorgehen?</p>
<pre><code class="language-cpp">class Foo
{
public:
//...
private:
    void init_bar();
    Bar* m_bar;
    int m_x;
    int m_y;
//...
};

Foo:Foo()
: m_x( 0 ), m_y( 0 )
{
    std::cout &lt;&lt; &quot;C'tor&quot; &lt;&lt; std::endl;
    m_bar = new Bar( 0, 0 );
    std::cout &lt;&lt; &quot;    new Bar in C'tor&quot; &lt;&lt; std::endl;
    init_bar();
}

Foo::~Foo()
{
    std::cout &lt;&lt; &quot;D'tor&quot; &lt;&lt; std::endl;
    if( bar )
    {
        std::cout &lt;&lt; &quot;    delete Bar in D'tor&quot; &lt;&lt; std::endl;
        delete bar;
        bar = 0;
    }
}

void Foo::init_bar()
{
    std::cout &lt;&lt; &quot;Init Bar&quot; &lt;&lt; std::endl;
    if( bar )
    {
        std::cout &lt;&lt; &quot;    delete Bar in Init Bar&quot; &lt;&lt; std::endl;
        delete bar;
        bar = 0;
    }
    std::cout &lt;&lt; &quot;    new Bar in Init Bar&quot; &lt;&lt; std::endl;
    bar = new Bar( m_x, m_y );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/156050/zeiger-sicher-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 18:10:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156050.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Aug 2006 14:02:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Sat, 12 Aug 2006 14:02:17 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Habe in einer Klasse einen Zeiger, den ich aber auf jedenfall freigeben möchte. Was haltet ihr von folgendem Vorgehen?</p>
<pre><code class="language-cpp">class Foo
{
public:
//...
private:
    void init_bar();
    Bar* m_bar;
    int m_x;
    int m_y;
//...
};

Foo:Foo()
: m_x( 0 ), m_y( 0 )
{
    std::cout &lt;&lt; &quot;C'tor&quot; &lt;&lt; std::endl;
    m_bar = new Bar( 0, 0 );
    std::cout &lt;&lt; &quot;    new Bar in C'tor&quot; &lt;&lt; std::endl;
    init_bar();
}

Foo::~Foo()
{
    std::cout &lt;&lt; &quot;D'tor&quot; &lt;&lt; std::endl;
    if( bar )
    {
        std::cout &lt;&lt; &quot;    delete Bar in D'tor&quot; &lt;&lt; std::endl;
        delete bar;
        bar = 0;
    }
}

void Foo::init_bar()
{
    std::cout &lt;&lt; &quot;Init Bar&quot; &lt;&lt; std::endl;
    if( bar )
    {
        std::cout &lt;&lt; &quot;    delete Bar in Init Bar&quot; &lt;&lt; std::endl;
        delete bar;
        bar = 0;
    }
    std::cout &lt;&lt; &quot;    new Bar in Init Bar&quot; &lt;&lt; std::endl;
    bar = new Bar( m_x, m_y );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1116029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116029</guid><dc:creator><![CDATA[Zeigerphobiker]]></dc:creator><pubDate>Sat, 12 Aug 2006 14:02:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Sat, 12 Aug 2006 14:18:37 GMT]]></title><description><![CDATA[<p>Wenn du die Klasse kopieren willst, solltest du für Kopierkonstruktor und op= sorgen, damit die auch korrekt kopiert werden. Denn sonst passiert etwas das du nicht erwartest. Z.b. so etwas:</p>
<pre><code class="language-cpp">void bla(Foo f){
  // tu was mit f;
}

int main(){
   Foo f;
   bla(f);
   //tu was mit f; OOpps Zeiger wurde ja schon gelöscht! (von der Kopie!)
}
</code></pre>
<p>BR<br />
Vinzenz<br />
//Edit: Ja saperalot da hab ich doch die code tags vergessen^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116036</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sat, 12 Aug 2006 14:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Sat, 12 Aug 2006 14:19:58 GMT]]></title><description><![CDATA[<p>Wenig, denn ich kann den Sinn nicht erkennen (Ausgaben entfernt):</p>
<pre><code class="language-cpp">class Foo
{
public:
//...
private:
    void init_bar();
    Bar* m_bar;
    int m_x;
    int m_y;
//...
};

Foo:Foo()
: m_x( 0 ), m_y( 0 )
{
    m_bar = new Bar( 0, 0 ); // ok, du erstellst ene neue Bar
    init_bar();
}

Foo::~Foo()
{
    if( bar )  // ist für die Katz, da bar an dieser Stelle garantiert nicht 0 sein kann.
    {
        delete bar;
        bar = 0;  // Für die Katz, da bar nach dem Rücksprung
                  // aus dem d-tor sowieso nicht mehr existiert
    }
}

void Foo::init_bar() // diese Methode wird nur im c-tor aufgerufen.                    
{                    // Wesshalb erstellst du sie nicht in ihm korrekt mit m_x und m_y??
                     // Was hat es für einen Sinn, absichtlich eine Instanz anzulegen,
                     // sie zu löschen und erneut anzulegen??

    if( bar ) // für die Katz, da delete 0-Pointer sowieso in Ruhe lässt
    {
        delete bar;
        bar = 0;
    }
    bar = new Bar( m_x, m_y );
}
</code></pre>
<p>Du hast übrigens die Deklaratinen des c-tors und des d-tors in der Klassendeklaration vergessen.<br />
Warum machst du nicht einfach:</p>
<p>Wenig, denn ich kann den Sinn nicht erkennen (Ausgaben entfernt):</p>
<pre><code class="language-cpp">class Foo {

    public:

        Foo( );
        Foo( int x, int y );
        ~Foo( );

    private:

        Bar* m_bar;
        int m_x;
        int m_y;
};

Foo:Foo( ) : m_x( 0 ), m_y( 0 )
{
    m_bar = new Bar( 0, 0 );
}

Foo::Foo( int x, int y ) : m_x( x ), m_y( y )
{
    m_bar = new Bar( m_x, m_y );
}

Foo::~Foo()
{
    delete m_bar;
}
</code></pre>
<p>?!</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116044</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sat, 12 Aug 2006 14:19:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Sat, 12 Aug 2006 14:25:07 GMT]]></title><description><![CDATA[<p>Sorry war ein etwas unkomplettes Beispiel.<br />
Die m_x und m_y werden erst in der init_bar() Funktion mit Werten belegt.<br />
Und ich wollt den Zeiger nicht uninitialisiert &quot;rumliegen&quot; lassen, aber dann ist das wohl unnötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116047</guid><dc:creator><![CDATA[Zeigerphobiker]]></dc:creator><pubDate>Sat, 12 Aug 2006 14:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Sat, 12 Aug 2006 20:21:06 GMT]]></title><description><![CDATA[<p>Wie wäre es denn mit:</p>
<pre><code class="language-cpp">class Foo {

    public:

        Foo( );
        Foo( int x, int y );

    private:

        int m_x;
        int m_y;
        Bar m_bar;
};

Foo:Foo( ) : m_x( 0 ), m_y( 0 ), m_bar(0, 0)
{ }

Foo::Foo( int x, int y ) : m_x( x ), m_y( y ), m_bar(x, y)
{ }
</code></pre>
<p>Da brauchst du keinen Pointer und brauchst dich nicht um die Allokation und Deallokation kümmern. So nebenbei wird auch der default Kopier- und Zuweisungsoperator funktionieren. Und schneller ist das ganze auch noch.</p>
<p>Ein Objekt, welches im Konstruktor angelegt und im Destruktor wieder frei gegeben wird, muß nicht dynamisch allokiert werden. Zeiger werden eigentlich viel zu oft verwendet. Ich verwende sie eher selten.</p>
<p>Ach ja - wenn Du jetzt für irgendeinen Funktions- oder Methodenaufruf einen Zeiger auf Bar als Parameter benötigst, bekommst Du ihn mit &amp;m_bar.</p>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116256</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Sat, 12 Aug 2006 20:21:06 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Sat, 12 Aug 2006 20:39:36 GMT]]></title><description><![CDATA[<p>Ne mein Problem ist doch, dass ich bar nicht im C'tor in der Initialisierungsliste zuweisen kann, weil ich x und y erst später in der init Funktion erhalte.<br />
Für bar brauch ich aber die beiden als Parameter im C'tor, und Standardparameter gehen nicht.<br />
Darum wollt ich das mit new in der init machen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116269</guid><dc:creator><![CDATA[Zeigerphobiker]]></dc:creator><pubDate>Sat, 12 Aug 2006 20:39:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 11:21:46 GMT]]></title><description><![CDATA[<p>Eigentlich sollte Bar aber einen Standardkonstruktor haben, so das du das ganze auch ohne Parameter initaliesieren kannst.</p>
<p>Wenn du das trozdem mit new und delete machen willst, ist es wohl das einfachste für dich die SmartPointer aus der Boost-Lib zu benutzen. Diese Pointer geben sich selbst frei, wenn sie nicht mehr gebraucht werden. Oder im d-tor einfach prüfen welche Zeiger deiner Klasse ungleich 0 sind und diese dann mit delete Freigeben. (Das setzt natürlich voraus, das du die Zeiger beim vorzeitigem löschen auch auf 0 setzt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116851</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Mon, 14 Aug 2006 11:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 11:39:23 GMT]]></title><description><![CDATA[<p>flammenvogel schrieb:</p>
<blockquote>
<p>Eigentlich sollte Bar aber einen Standardkonstruktor haben, so das du das ganze auch ohne Parameter initaliesieren kannst.</p>
</blockquote>
<p>Bar ist nicht von mir, die Klasse will ich adaptieren/wrappen. Die hat zwar einen Defalut C'tor, dann ist m_bar aber logischerweise leer, und ich muss alle Elemente einzeln über eine Iterator Schlaufe (wie bei STL Containern) einfüllen. Das bedeutet dann eine x-fache Speicherreallocation, da Bar intern mit Arrays arbeitet. Effizienter wäre, dem C'tor Anfangs- und Enditerator zu übergeben, denn dann nimmt Bar die Elemente direkt rüber in die eigenen Datenfelder, was scheints optimiert wurde.</p>
<pre><code class="language-cpp">// Also statt:
Bar m_bar;
for( it = it_begin; it != it_end; it++ )
{
    Bar::add_element( *it, m_bar );
}

// einfach so:
Bar m_bar( it_begin, it_end );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1116862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116862</guid><dc:creator><![CDATA[Zeigerphobiker]]></dc:creator><pubDate>Mon, 14 Aug 2006 11:39:23 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 12:12:06 GMT]]></title><description><![CDATA[<p>flammenvogel schrieb:</p>
<blockquote>
<p>Oder im d-tor einfach prüfen welche Zeiger deiner Klasse ungleich 0 sind und diese dann mit delete Freigeben. (Das setzt natürlich voraus, das du die Zeiger beim vorzeitigem löschen auch auf 0 setzt)</p>
</blockquote>
<p>Wesshalb nach einem &quot;vorzeitigem&quot; <em>delete pointer</em> dem <em>pointer</em> 0 zuweisen und im d-tor vor dem <em>delete pointer</em> auf <em>pointer != 0</em> prüfen!?</p>
<p>Tipp: <em>delete</em> lässt 0-Zeiger in ruhe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116892</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Mon, 14 Aug 2006 12:12:06 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 12:21:43 GMT]]></title><description><![CDATA[<blockquote>
<p>Tipp: delete lässt 0-Zeiger in ruhe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
</blockquote>
<p>Warum macht DirectX dann immer diese SAFERELEASE Konstrukte?<br />
Da wirds doch genau so gemacht?</p>
<pre><code class="language-cpp">if( LPDIRECTXIRGENDWAS )        // LongPointer auf DXInterface, typedef für pointer
{
    LPDIRECTXIRGENDWAS-&gt;release();   // Wohl ein Wrapper für delete oder nicht?
    LPDIRECTXIRGENDWAS = 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1116902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116902</guid><dc:creator><![CDATA[Zeigerphobiker]]></dc:creator><pubDate>Mon, 14 Aug 2006 12:21:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 12:25:59 GMT]]></title><description><![CDATA[<p>Zeigerphobiker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">LPDIRECTXIRGENDWAS-&gt;release();   // Wohl ein Wrapper für delete oder nicht?
</code></pre>
</blockquote>
<p>oder.</p>
<p>das ist ein aufruf einer memberfunktion - und das ist nur legal, wenn LPDIRECTXIRGENDWAS auf ein lebendes objekt zeigt. dass release() ganz nebenbei evtl. noch für das löschen zuständig ist, spielt dabei keine rolle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116907</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Aug 2006 12:25:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 12:31:42 GMT]]></title><description><![CDATA[<p>Ok, dann ist prüfen auf Null unnötig vor delete.<br />
Wie ist es mit initialisieren? Wohin zeigt ein Zeiger, wenn er mit<br />
Bar* m_bar;<br />
angelegt wird? Auf 0? Oder muss ich erst<br />
m_bar = 0;<br />
im C'tor schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116916</guid><dc:creator><![CDATA[Zeigerphobiker]]></dc:creator><pubDate>Mon, 14 Aug 2006 12:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 12:39:04 GMT]]></title><description><![CDATA[<p>Du solltest deinen Zeiger mit 0 initialisieren, ansonsten steht irgendein Wert im Zeiger.<br />
Am besten wirklich initialisieren nicht irgendwie zuweisen! <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>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116921</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 14 Aug 2006 12:39:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 12:45:53 GMT]]></title><description><![CDATA[<p>Was meinst Du mit &quot;wirklich&quot; initialisieren statt zuweisen?<br />
Das Objekt kann ich erst in der init() erzeugen, s.o. warum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116926</guid><dc:creator><![CDATA[Zeigerphobiker]]></dc:creator><pubDate>Mon, 14 Aug 2006 12:45:53 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 12:52:09 GMT]]></title><description><![CDATA[<p>Initialisiert wird per Initialisierungsliste. Wenn das Objekt dort nicht initialisiert wird, wird es mit einem Defaultwert initialisiert. Alle späteren Aktionen machst du also mit einem schon initialisierten Objekt.</p>
<p>Die Initialisierungsliste bietet u.A. den Vorteil das der C'tor Rumpf ggf nicht extra aufgerufen werden muss und dein Objekt nicht mit Defaultwerten vollgepumpt wird.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116933</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 14 Aug 2006 12:52:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 13:01:26 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Foo
{
public:
    Foo()
        : m_bar( 0 ),          // Richtig so?
          m_x( 0 ), m_y( 0 )
    {
        init_bar();
    }
    ~Foo()
    {
        delete m_bar;         // ohne check auf Null
    }
private:
    void init_bar()
    {
        // get m_x and m_y from extern source..
        m_bar = new Bar( m_x, m_y );
    }
    Bar* m_bar;
    int m_x;
    int m_y;
};
</code></pre>
<p>Etwa so meinst Du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116945</guid><dc:creator><![CDATA[Zeigerphobiker]]></dc:creator><pubDate>Mon, 14 Aug 2006 13:01:26 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 13:06:41 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Foo
{
public:
    Foo()
        : m_bar( new Bar( 0, 0 ) ),          // Richtig so?
          m_x( 0 ), m_y( 0 )
    {}

    ~Foo()
    {
        delete m_bar;         // ohne check auf Null
    }
private:
    void init_bar()
    {
        // get m_x and m_y from extern source..
        m_bar = new Bar( m_x, m_y );
    }
    Bar* m_bar;
    int m_x;
    int m_y;
};
</code></pre>
<p>In dem Fall kannst du auf den Aufruf von init_bar verzichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116948</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 14 Aug 2006 13:06:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 13:46:34 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Foo
{
public:
    Foo()
        : m_bar( new Bar( 0, 0 ) ),          // Erstelle hier ein Objekt
          m_x( 0 ), m_y( 0 )
    {}

    ~Foo()
    {
        delete m_bar;         
    }
private:
    void init_bar()
    {
        // get m_x and m_y from extern source!!
        m_bar = new Bar( m_x, m_y );       // Und biege hier den Zeiger auf ein neues Objekt, was wird dann aus dem, das ich im Ctor erstellt habe?
    }
    Bar* m_bar;
    int m_x;
    int m_y;
};
</code></pre>
<p>new Bar( 0, 0 ) wollt ich eben eigentlich gern vermeiden..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116985</guid><dc:creator><![CDATA[Zeigerphobiker]]></dc:creator><pubDate>Mon, 14 Aug 2006 13:46:34 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 14:34:45 GMT]]></title><description><![CDATA[<p>Hi Zeigerphobiker,</p>
<p>ich habe mal eine ganz andere Frage: Wenn Foo eine Wrapperklasse von Bar sein (und Bar mit ihr sterben) soll, warum soll sie dann früher ins Leben gerufen werden als Bar ?</p>
<p>Oder hast Du eigentlich etwas Anderes vor, nämlich, dass FooBar ein Bar verwaltet (=komplett aggregiert und &quot;Besitz übernimmt&quot;) ?<br />
In dem Fall kann ich kein echtes Problem in Deinem ursprünglichen Vorgehen sehen. Du verwaltest im Pointer Bar* bar; im Grunde 2 Informationen:<br />
1. Ob bar schon initialisiert wurde (&quot;bar != 0&quot;) und<br />
2. Wenn schon initialisiert: Wo die Daten liegen.<br />
Dann ist ein &quot;Foo(...) : bar(0), ... {...}&quot; konsequent (also nicht ein leeres Objekt erzeugen).</p>
<p>Allerdings stimmt schon: Du musst Dich um &quot;Kopieren&quot; (copyCtr, operator=()) kümmern, um Speicherlecks bzw. Doppeltlöschungen zu verhindern.<br />
- Einfachstes: Kopieren verbieten (copyCtr und operator=() private machen) =&gt; STLContainer funktionieren nicht mehr ... aber das kann durchaus verschmerzbar sein.<br />
- Alternativ: &quot;Tiefe Kopie&quot; =&gt; Kann unangenehm auf die Performance und den Speicherplatz drücken<br />
- ... (gibt noch viele andere Konzepte bis hin zu globaler &quot;bar-Objekt-Verwaltung&quot;)</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1117034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1117034</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 14 Aug 2006 14:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger sicher verwenden? on Mon, 14 Aug 2006 14:45:54 GMT]]></title><description><![CDATA[<p>Also es ist so:</p>
<p>Foo::init_bar() erhält Informationen von Ausserhalb, füllt zwei Container (Member von Foo) mit diesen Informationen, und erzeugt dann Bar mit den Iteratoren der Container. Von daher war das Beispiel mit x und y etwas zu vereinfacht.<br />
Bar ist also eine komplexe Datenstruktur aus einer fremden Lib.<br />
Werd es dann so machen wie oben, ( &quot;Foo(...) : bar(0), ... {...}&quot; ) und CopyCtor und Op= verstecken, da ich eh nur ein Objekt Foo pro Anwendung erstelle.</p>
<p>Danke euch allen und<br />
schöne Grüsse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1117045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1117045</guid><dc:creator><![CDATA[Zeigerphobiker]]></dc:creator><pubDate>Mon, 14 Aug 2006 14:45:54 GMT</pubDate></item></channel></rss>