CTypedPtrArray Rückgabe Problem



  • Hallo,

    hier erstmal mein Code:

    // CMyClass.h
    private:
      // verwende hier mehrwertige Assoziationen  
      CTypedPtrArray < CObArray, CMyAnnerClass* > *m_pGitter;
    
    // CMyClass.cpp
    void CMyClass::Init()
    {
      m_pGitter = new CTypedPtrArray < CObArray, CMyAnnerClass* >;
      m_pGitter->SetSize(size);
      for(int i=0; i<size; i++)
      {
        (*m_pGitter)[i] = new CMyAnnerClass();
      }
    }
    
    CTypedPtrArray < CObArray, CMyAnnerClass* > *CMyClass::GetGitter()
    {
      return &m_pGitter;
    }
    

    sieht doch in Ordnung aus, oder?
    Mein Kompiler sagt mir der return-Wert habe Konvertierungsprobleme.
    Wenn ich etwas mit den Pointer spiele, wie z.B. den Adressoperator weg lasse, wird die Anwendung zwar Fehlerfrei kompiliert, das Program stürzt aber sofort ab. Wo liegt mein Fehler?



  • toh schrieb:

    sieht doch in Ordnung aus, oder?

    Nein, das & ist zu viel.

    Mein Kompiler sagt mir der return-Wert habe Konvertierungsprobleme.

    Dein Compiler sagt dir mit Sicherheit etwas anderes. Der genaue Wortlaut einer Fehlermeldung ist besser als deine Interpretation.

    Wenn ich etwas mit den Pointer spiele, wie z.B. den Adressoperator weg lasse, wird die Anwendung zwar Fehlerfrei kompiliert, das Program stürzt aber sofort ab. Wo liegt mein Fehler?

    Nicht in dem Code, den du gezeigt hast. Was sagt denn der Debugger?



  • Mein Fehler, es lag an was anderem, sry für die verwirrung!

    Ich hätt da aber noch ne andere Frage, wie gibt man obiges Konstrukt am besten wieder frei? Meine Anwendung hat jede Menge Memory-Leaks...




  • Administrator

    Jo ist sowieso unglaublich kompliziert dein Konstrukt.

    // CMyClass.h
    private:
        // verwende hier mehrwertige Assoziationen
        // Wofür ein Pointer, leg doch lieber das Objekt normal an.
        // Die Objekte im Array, also die Pointer in dem Fall,
        // werden sowieso auf den Heap gepackt. Das ist nunmal nicht ein
        // normales Array.
        CTypedPtrArray<CObArray, CMyAnnerClass*> m_GitterArray;
    
    // CMyClass.cpp
    void CMyClass::Init()
    {
        // Somit fällt dieses Zeugs hier sowieso weg.
        // Das Setsize ist übrigens auch völlig unnötig.
        // Die Grösse wird automatisch angepasst,
        // Dieses Array ist dynamisch.
        for(int i=0; i<size; i++)
        {
            // Viel zu kompliziert.
            CMyAnnerClass* pMAC = new CMyAnnerClass()
            m_GitterArray.Add(pMAC);
        }
    }
    
    CTypedPtrArray<CObArray, CMyAnnerClass*>* CMyClass::GetGitter()
    { return &m_Gitter; }
    

    Dann musst du aber noch dafür sorgen, dass der Heapspeicher freigegeben wird.

    // z.b. im Destruktor
    while(m_GitterArray.GetCount() > 0)
    {
        CMyAnnerClass* pMAC = m_GitterArray.GetAt(0);
        delete pMAC;
    
        m_GitterArray.RemoveAt(0);
    }
    

    Wenn du CTypedPtrArray auch noch auf den Heap verbannen willst, was meiner Meinung nach wirklich nicht nötig ist. Dann mach im Destruktor folgendes rein:

    // Destruktor
    // Wenn m_pGitter ein Zeiger auf ein TypedPtrArray ist:
    if(m_pGitter != NULL)
    {
        while(m_pGitter->GetCount() > 0)
        {
            CMyAnnerClass* pMAC = m_pGitter->GetAt(0);
            delete pMAC;
    
            m_pGitter->RemoveAt(0);
        }
    
        delete m_pGitter;
    }
    

    Ich hoffe ich konnte dir ein wenig weiterhelfen 😉

    Grüssli



  • Vielleicht hilft Dir auch die MSDN beim Verständnis weiter (siehe vor allem die angegebenen Links):
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_CTypedPtrArray.asp



  • Dravere schrieb:

    Jo ist sowieso unglaublich kompliziert dein Konstrukt.

    naja, so wollte es unser prof...
    aber wiso kompliziert? ist doch klar erkennbar was dort passiert!?

    @Erhard Henkes: danke für deine new/delete einführungslektüre 🙂
    aber mir gings doch eher um die zerstörung speziell meines konstruktes 🙂


  • Administrator

    toh schrieb:

    Dravere schrieb:

    Jo ist sowieso unglaublich kompliziert dein Konstrukt.

    naja, so wollte es unser prof...
    aber wiso kompliziert? ist doch klar erkennbar was dort passiert!?

    Ok ich ziehe das kompliziert zurück und setze ein umständlich ein. Und mich würde mal wunder nehmen, was denn der Prof wirklich wollte. Das mit dem SetSize wohl eher nicht. Das ist ja völlig unnötig, nein sogar Fehleranfällig.

    Grüssli



  • mir gings doch eher um die zerstörung speziell meines konstruktes

    Ja, das kann ich verstehen. Diesen Verhau würde ich auch klein häckseln! :schland:


Anmelden zum Antworten