Klarheiten schaffen: Scope



  • Hallo,

    ich benutze innerhalb einer Klasse einen Smartpointer, der laut MSDN

    "automatically call IUnknown::Release when the smart pointer goes out of scope"

    Nun frage ich mich aber, wann der Scope genau endet.

    class A
    {
       A()
       {
          CreateObject(&test);
       }
       IXRFrameworkElementPtr test; // Smartpointer
    };
    

    In dem Beispiel beginnt meiner Auffassung nach der Scope, sobald ich ein Objekt der Klasse A erstelle. Enden tut er, sobald der Destruktor von A aufgerufen wird, also A zerstört wird. Also ist der scope vom SmartPointer 1:1 an das Objekt der Klasse A gekoppelt (wenn ich nicht explizit an anderer Stelle nur den Smartpointer zerstöre)?!

    Das heißt aber auch, wenn ich ein Objekt inst von A irgendwo im Heap angelegt habe, bleibt mein Smartpointer auch für die Existenz von inst bestehen, bis ich inst explizit mit delete(inst) zerstöre?!


  • Mod

    neu_hier schrieb:

    Also ist der scope vom SmartPointer 1:1 an das Objekt der Klasse A gekoppelt

    Ja.

    (wenn ich nicht explizit an anderer Stelle nur den Smartpointer zerstöre)?!

    😮 Was willst du tun? Einzelne Member einer Klasse zerstören? Lass das mal lieber bleiben.

    Das heißt aber auch, wenn ich ein Objekt inst von A irgendwo im Heap angelegt habe, bleibt mein Smartpointer auch für die Existenz von inst bestehen, bis ich inst explizit mit delete(inst) zerstöre?!

    Ja.

    edit: Dein Smartpointer klingt von der Funktionalität her übrigens genau wie der auot_ptr aus der Standardbibliothek. Warum in die Ferne schweifen...



  • neu_hier schrieb:

    Also ist der scope vom SmartPointer 1:1 an das Objekt der Klasse A gekoppelt (wenn ich nicht explizit an anderer Stelle nur den Smartpointer zerstöre)?!

    Das heißt aber auch, wenn ich ein Objekt inst von A irgendwo im Heap angelegt habe, bleibt mein Smartpointer auch für die Existenz von inst bestehen, bis ich inst explizit mit delete(inst) zerstöre?!

    Beides ja.

    MfG, EOutOfResources

    EDIT: Ja, einzelne Member eben nicht und es sollte delete (ptr) statt delete (inst) heissen.



  • SeppJ schrieb:

    (wenn ich nicht explizit an anderer Stelle nur den Smartpointer zerstöre)?!

    😮 Was willst du tun? Einzelne Member einer Klasse zerstören? Lass das mal lieber bleiben.

    Halb so wild, wahrscheinlich kann man explizit Release aufrufen. Im Destruktor passiert dann einfach nichts mehr.


Anmelden zum Antworten