Erzwingen, dass eine Klasse auf dem Stack erzeugt wird?


  • Mod

    John Doe schrieb:

    Fortsetzung "krank" 😃 😃

    Da wir sowas nicht möchten machen wir den Destruktor natürlich auch private. 😉

    mfg JJ

    dummerweise ist die klasse dann gänzlich unbenutzbar - nicht bloss auf dem heap 🙂



  • Das mit der Ironie will mir heute einfach nicht gelingen. 😃 😃

    mfg JJ



  • Bevor ich mich zu Tode suche:
    Es wird hier (und in anderen Threads) oft von placement new gesprochen.
    Was ist denn das?



  • Ich hab das Wort "zwingen" überlesen, ich wusste doch das meine Antwort Müll ist 😃



  • Du allokierst dir erst "genügend" Speicher und erzeugst dann dein Objekt genau
    an dieser Adresse. (Siehe code von camper)

    mfg JJ



  • Also... Ich glaube ich werde den new und new[] operator private zu machen. Das sollte dann Hinweis genug sein, dass man diese Klasse nicht auf dem Heap anlegen sollte.
    Ich werd' mal davon ausgehen, dass niemand wirklich versucht die Klasse per placement new auf den Heap zu drücken, aber trotzdem Danke für das Bsp. Wusste auch nicht, dass es sowas gibt.
    Danke für eure Antworten :)!



  • Bloede Frage: warum willst du das eigentlich?

    Auf den Heap zwingen kann Sinn machen, weil man dann delete this; verwenden kann oder aehnliches. Was aber bringt es auf dem Stack?



  • Gar nicht so ne blöde Frage... Ich möchte ein paar Klassen per PImpl Idiom erstellen, bei der die öffentliche Schnittstelle automatisches reference counting für die Implementation übernimmt. Schaden würde es nicht, wenn die Klasse (das Interface) auf dem Heap angelegt wird, aber dadurch würde ein Stück der Einfachheit und des SmartPointer-Verhaltens der Klasse verloren gehen.



  • Shade Of Mine schrieb:

    Bloede Frage: warum willst du das eigentlich?

    Auf den Heap zwingen kann Sinn machen, weil man dann delete this; verwenden kann oder aehnliches. Was aber bringt es auf dem Stack?

    stell dir mal nen scoped_ptr aufm heap vor 😃



  • otze schrieb:

    stell dir mal nen scoped_ptr aufm heap vor 😃

    Du meinst sowas hier

    scoped_ptr<scoped_ptr<foo> > p(new scoped_ptr<foo>(new foo));
    

    😃 :p


  • Mod

    weils so schön war: placement new ist nat. völlig unnötig, um der private deklaration von new/delete entgegenzuwirken 🙂

    class foo
    {
    private:
    	void* operator new(size_t);
    	void operator delete(void*) {};
    public:
    	foo() { std::cout << "foo\n"; }
    virtual ~foo() { std::cout << "...foo\n"; }
    };
    int main()
    {
    	foo *bar = ::new foo;
    	::delete bar;
    }
    

    geht auch.


Anmelden zum Antworten