Frage zu auto_ptr



  • Wenn du denkst, dass das new schief gehen könnte müsstest du um jedes new einen try/catch-Block legen. Da das aber eher selten passiert, es sei denn der Konstruktor der konstruierten Klaase kann eine Exception werfen, macht man das normalerweise nicht.
    Bei solch kleinen Klassen kann der Speicher eigentlich nicht ausgehen. 🙂
    Wenn du sehr viel Speicher anforderst macht das aber auch wieder Sinn.



  • Ok, Danke! 👍



  • Hab auch eine Frage. 😉

    auto_ptr<TPanel> Panel(new TPanel(this));
        //TPanel *Panel = new TPanel(this);
        Panel->Parent = ScrollBox1;
        Panel->Align = alTop;
        Panel->Height = 200;
    

    Der Code bewirkt garnichts. Tausche ich aber die Zeile auto_prt mit der "normalen" Variante aus, dann geht es und ich sehe in der ScrollBox ein Panel. Kann mir jemand sagen was ich falsch mache? Auch in der normalen Version muss man sich aber nicht um das löschen (delete) kümmern, da dies von der Form bzw Scrollbox erledigt wird, richtig?



  • Ich bin ja doof, der löscht das natürlich am Ende der Funktion bei auto_ptr. *feix*



  • Eine auto_ptr Instanz wird ungültig wenn sie ihren Scope verlässt. Es könnte sein, das dein auto_ptr zu lokal ist.



  • ptrus schrieb:

    Nabend.

    Ich habe hier ein funktionierendes VC6 Projekt das ich in BCB5 übernehmen möchte.

    auto_ptr<char> m_apKey;
    m_apKey = auto_ptr<char>(new char[m_keylength]);
    

    Jetzt bekomme ich leider den Fehler:

    E2285 Keine Übereinstimmung für 'auto_ptr<char>::operator =(auto_ptr<char>)' gefunden

    Sieht wer den Fehler und kann diesen mir bitte benennen? 🙄

    VC6 klappts, aber BCB5 will nicht.

    Ist zwar schon älter, aber es ist doch bezeichnend, dass irgendwie keiner der verbreiteten Compiler (vc++, bcb, gcc) in der Lage ist, einen korrekten auto_ptr anzubieten.



  • Sollte das überhaupt gehen?
    Immerhin wird hier ein Array an einen auto_ptr gebunden der dann ja nicht das korrekte delete bereitstellen sollte.
    Der BCB5 ist allerdings schon recht alt. Der BCB2007 compiliert das.



  • Braunstein schrieb:

    Sollte das überhaupt gehen?
    Immerhin wird hier ein Array an einen auto_ptr gebunden der dann ja nicht das korrekte delete bereitstellen sollte.
    Der BCB5 ist allerdings schon recht alt. Der BCB2007 compiliert das.

    Natürlich ist die Geschichte undefiniert, aber die Fehlermeldung indiziert, dass auch ein

    m_apKey = auto_ptr<char>(new char);
    

    fehlschlagen würde.



  • @Braunstein

    Ich habs mit get() ausprobiert, leider ohne erwarteten Erfolg.

    auto_ptr<TIniFile> ini(new TIniFile(Folder));
    if (!ini.get()) ShowMessage("Error");
    

    Ich kann einen gültigen Pfad setzen oder irgendwas, er zeigt mir nie die ShowMessage an. 😞



  • Hallo

    ja was erwartest du denn auch? Die Abfrage mit dem get() bringt nur die Unterscheidung ob NULL oder nicht NULL. Damit kannst du aber nicht überprüfen ob die Instanz irgendwelche inhaltlichen Fehler liefert.
    Da new immer gültige Instanzen und damit Adressen liefert (es sei denn der Speicher kann nicht reserviert werden) schlägt die Abfrage immer fehl, da danach immer eine Adresse ungleich NULL im auto_ptr steht. Das ist auch kein "Fehler" des auto_ptr.
    Wie du konkrete Fehler bei TIniFile abfragen kannst must du schon in der BCB-Hilfe nachlesen.

    bis bald
    akari



  • akari schrieb:

    Da new immer gültige Instanzen und damit Adressen liefert (es sei denn der Speicher kann nicht reserviert werden)

    und dann wird eine Exception geworfen. So oder so ist die Abfrage Unsinn.



  • Kann man nicht auf new(nothrow) verwenden, mit dem Resultat, dass statt einer Exception ein NULL-Zeiger zurückgegeben wird?



  • kann man, aber warum?
    Wenn kein Speicher mehr da ist, ist der normale Programmablauf doch sowieso schwer gestört. Wenn das kein Grund für eine Exception ist, was dann? 🙂


Anmelden zum Antworten