Frage zu Garbage Collector!!



  • Ich spiel grad bischen in C++ /CLR rum und hab ne managed und ne unmanaged class gebaut. Jeweils ein Consolenoutput im Konstruktor und Destruktor gegeben. Damit ich weis ob die Objekte korrekt erzeugt und gelöscht werden. Wie ich mir auch gedacht habe, wird die UnManaged Klases korrekt freugegeben, die Managed aber nicht.

    Nun Meine Frage: Kann es sein das der Garbage Collector selbst beim Programm ende nich alle übrigen offen Speicherblöck freigibt? Dachte eigentlich das er es beim Programm ende aufjedenfall tun müsste.

    Beispiele:

    //-------------------------------------
    // UnManaged
    //-------------------------------------
    class CUnManaged{
    
    	int m_i;
    public:
    
    	CUnManaged(int i) : m_i(i)
    	{
    		Console::WriteLine(L"Unmanaged Konstruktor");
    	}
    	~CUnManaged()
    	{
    		Console::WriteLine(L"Unmanaged Destruktor");
    	}
    
    };
    
    //-------------------------------------
    // Managed
    //-------------------------------------
    ref class CManaged{
    
    	int m_i;
    	CUnManaged *m_pU; //Unmanaged in Managed Class
    
    public:
    	CManaged(int i) : m_i(i),m_pU(new CUnManaged(i))
    	{
    		Console::WriteLine(L"Managed Konstruktor");
    	}
    
    	~CManaged(){
    		Console::WriteLine(L"Managed Destruktor");
    		delete m_pU;
    	}
    };
    
    int main(array<System::String ^> ^args)
    {
    	CUnManaged *pU = new CUnManaged(5);
    	CManaged ^pM= gcnew CManaged(4);
    	delete pU;
        Console::WriteLine(L"Hello World");
    
        return 0;
    }
    

    Noch ne frage:

    CUnManaged *pU = new CUnManaged(5);
    
    CManaged ^pM= gcnew CManaged(4);
    

    das "^pM" ist das ne referenz (wie C#)? Wenn ja wieso kann ich das derefenzieren?

    Edit: Gibts kein tool das mit die speicherfreigabe vom .NET GC anzeigt;)





  • ~CManaged(){ 
            Console::WriteLine(L"Managed Destruktor"); 
            delete m_pU; 
        }
    

    ROFL
    So ein Blödsinn.

    Das was du da geschrieben hast ist kein Destruktor, das ist die "Dispose" Implementierung. Destruktoren gibt es bei Managed-Klassen nicht. Das an was du denkst wenn du "managed Destruktor" denkst ist vermutlich der Finalizer, und den kannst du in C++/CLI schreiben wenn du das ~ durch ein ! ersetzt.

    BTW: wenn du in C++/CLI IDisposable::Dispose aufrufen willst, dann schreibst du einfach "delete managedPointer;". Die C++/CLI Syntax ist recht eigen und es ist meist lange nicht damit getan ein "ref" vor ein "class" zu schreiben wenn man eine sinnvolle, korrekt funktionierende managed class programmieren will.

    Du solltest dich aber erstmal gut über IDisposable, Finalizer und den ganzen GC Kram im Allgemeinen informieren wenn du was in C++/CLI schreiben willst. z.B. wann und wo Finalizer ausgeführt werden, auf was man daher achten muss wenn man Finalizer schreibt, was man da drin machen sollte und was man da drin NICHT machen sollte etc.



  • hustbäer schrieb:

    ROFL
    So ein Blödsinn.

    was meinst wieso ich frage;)

    das ding heist übrigesn

    !CManaged(){
            Console::WriteLine(L"Managed Destruktor");
            delete m_pU;
        }
    

Anmelden zum Antworten