Speicherleck mit map variablen in abgeleiteter Klasse



  • Hallo,

    VS2005 zeigt mir das ich ein Speicherleck in einer abgeleiteten Klasse meiner Basisklasse habe. Durch testen und auskommentieren habe ich herausgefunden das ich nur Speicherlecks in abgeleiteten Klassen habe die einen zusätzliche map-Container haben. Diese Variable fülle ich im Konstruktor mit Werten.
    Hier der Code der beiden Klasse:

    class CBaseTraceData
    {
    public:
       CBaseTraceData(SYSTEMTIME tTime, const T_BASE_TRACE_DATA *ptBaseTraceData, UCHAR *pRawData, UCHAR ucRawSize)
          : m_tTime(tTime), m_ptTraceData(ptBaseTraceData)
       {
          for (int i=0; i < ucRawSize; i++)
          {
             m_vecData.push_back(pRawData[i]);
          }
       }
    
       // diverse Zugriffsfunktionen
       ...
    
       // diverse Ausgabefunktionen
       virtual void Print(bool WriteHeader = false);
       virtual void Print(CListCtrl &ListCtr);
       virtual void Print(CStdioFile &File, bool WriteHeader = false);
    
    protected:
       // data
       SYSTEMTIME   m_tTime;
       const T_BASE_TRACE_DATA *m_ptTraceData;
       vector<UCHAR> m_vecData;
       map < UCHAR, CString > m_SubTrace;
    
       virtual CString strBuildTimeString(void);
       virtual CString strBuildTraceNameString(void)=0;
       ...
    };
    
    class CTraceDataStt : public CBaseTraceData
    {
    public:
       CTraceDataStt(SYSTEMTIME tTime, const T_BASE_TRACE_DATA *ptBaseTraceData, UCHAR *pRawData, UCHAR ucRawSize)
       : CBaseTraceData(tTime, ptBaseTraceData, pRawData, ucRawSize)
    {
       for (UINT i=0; i < STT_EVENT_CNT; i++)
       {  
          m_SubTrace[tSttEventsData[i].ucSubTrace] =  SttEventsData[i].strSubTraceName;
       }
    
       for (UINT i=0; i < STT_STATE_CNT; i++)
       {  
          m_SubTraceStt[tSttStatesData[i].ucSubTrace] = tSttStatesData[i].strSubTraceName;
       }
    }
    
    protected:
       virtual CString strBuildTraceNameString(void);
       virtual CString strBuildAddData1String(void);
       virtual CString strBuildAddData2String(void);
    
    private:
       map < UCHAR, CString > m_SubTraceStt;
    };
    

    Wie gesagt, wenn ich jetzt die abgeleitete Klasse CTraceDataStt mit new erzeuge, gleich mit delete wieder lösche und mein Programm beende zeigt mir VS2005 Speicherlecks.
    In abgeleiteten Klassen ohne den zusätzliche map-Container habe ich kein Problem. Das verwirrt mich auch noch.

    Sieht jemand das Problem. Ich bin leider ratlos.😕
    Danke für jeden Tip!

    Thomas



  • mach den destructor der basis klasse entweder:
    - public und virtual
    oder (je nach gebrauch)
    - protected und non virtual

    Simon



  • Danke für den Tip. Klapp hervorragend.
    Dabei hab ich das Buch "Effektiv C++ programmieren" hier.
    Na ja, wer lesen kann ist klar im Vorteil.

    Thomas


Anmelden zum Antworten