std::auto_ptr == operator



  • Zumindest wenn du z.B. CString *pStr = NULL; machst und dann pStr->GetLength() oder was anderes aufriufst gibt's Ärger, da noch kein Speicher mit new oder alloc zugewiesen ist.

    Die get-Memberfunktion von auto_ptr gibt doch nur den Zeiger auf das unterliegende Objekt zurück. Und diesen prüfst du doch dann nur auf NULL. Da wird ja nichts illegales aufgerufen.



  • Deine Behauptung wäre nur richtig wenn es um Pointer auf auto_ptr geht.

    Also std::auto_ptr<MeineKlasse>* pAutoPtr;



  • Besser so:

    MeineKlasse &MeineKlasse::GetInstance()
    {
    	if (!m_apInstance)
    		m_apInstance.reset(new MeineKlasse());
    
    	return *m_apInstance;
    }
    

    Kann ich denn irgendwie abfragen, ob m_apInstance schon initialisiert wurde, außer dass ich eine Flag-Variable like: static bool m_bInitialized verwenden muss?

    Ja klar, genauso wie in GetInstance.

    BTW eignet sich boost::scoped_ptr hier eigentlich noch besser, weil std::auto_ptr ein sehr unintuitives Kopier- und Zuweisungsverhalten hat, was sich auf die Klasse überträgt. scoped_ptr läßt Kopieren und Zuweisen einfach gar nicht zu. Das mag aber nicht so entscheidend sein, weil deine Klasse (als Singleton) wahrscheinlich sowieso privaten Kopierkonstruktur und Zuweisungsoperator hat.



  • ..



  • ..



  • ..



  • ..



  • @vielleicht!

    vielleicht! schrieb:

    Die get-Memberfunktion von auto_ptr gibt doch nur den Zeiger auf das unterliegende Objekt zurück. Und diesen prüfst du doch dann nur auf NULL. Da wird ja nichts illegales aufgerufen.

    Du hattest vollkommen Recht 🙂
    if (c_apInstance.get() == 0) funktioniert. Ich musste bloss die Dokumentation von std::auto_ptr gründlicher lesen..
    Dann wäre ich auch für meine eigene Faulheit nicht bestrafft ;=)

    @Bashar
    Ich habe das bisschen anders gelöst. Nachdem ich if (c_apInstance.get() == 0) geprüft habe und in dem if scope mit new neuen Speicher zugewiesen habe, anschließend: ASSERT(c_apInstance.get()); gemacht.
    Meine Klasse ist ein singleton und da nur eine Instance gleichzeitig erlaubt ist,
    macht das absolut keinen Sinn die einzige Instance Variable c_apInstance zu deleten und neuen Speicher zu zuweisen 🙂

    Danke an alle!



  • Hat man hier nicht mal einen Button, wo man doppelte Beiträge löschen kann?
    Wo ich versucht habe auf den Beitrag zu antworten oder überhaupt das Forum zu betreten, hatte ich ständig angezeigt bekommen:
    "cgi-error: max number of clients was reached, try again later"
    oder so ung.



  • Ne geht nicht. Ist ja auch scheiß egal.

    Das Forum ist ein bisschen buggy. Dich trifft kaum schuld. 😉


Anmelden zum Antworten