Speicher Leacks? Eine unmögliche Sache!



  • Hallo Leute,

    Ich habe zwei Funktion:

    void CaptureTableDescription( int index, TABLE_DESCRIPTION *pTableDescription )
    {
      [...]
      // HIER KOMMT EIN LEAK FEHLER!
      pTableDescription->name.assign(  tb_name );
      [...]
    }
    
    void CaptureTables()
    {
    	for( int i=0; i < 16; i++ )
    	{
    		TABLE_DESCRIPTION td;
    		CaptureTableDescription( i, &td );
    	}
    }
    

    Und ich kann mir einfach nicht vorstellen, warum an dieser Stelle ein leak-error kommt. Wenn die Zeile entfernt wird -> ist dieser weg!!

    Ich benutze VC++ (MFC) mit teilweise ManagedC++. Soll ich die Nachrichten einfach ignorieren?? 🙂



  • PS:

    Detected memory leaks!
    Dumping objects ->
    {1377} normal block at 0x003BD648, 16 bytes long.
    Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
    {1342} normal block at 0x003BD5F8, 16 bytes long.
    ....



  • Vielleicht weil bei "assign" Speicher allokiert wird!? Und Du entweder "pTableDescription->name" oder "pTableDescription" nicht mehr freigibst...



  • Hm, naja TABLE_DESCRIPTION td; wird ganz normal deklariert. und Somit wird der destruktor automatishc aufgefunden.

    name ist vom type std::string.

    struct TABLE_DESCRIPTION {
    std::string name;
    };
    


  • Naja, er *würde* automatisch aufgerufen, wenn Du Ihn nicht via "new" allokiert hättest...
    Weil sonst würdest Du ja via:

    pTableDescription.name.assign
    

    zugreifen, oder?

    PS: Und Du bist sicher, dass der Leak-Dump nicht *vor* dem destructor aufgerufen wird?



  • Also ich übergebe "pTableDescription" Als Pointer einer "normalen" variable. TABLE_DESCRIPTION wird nicht!! via new aufgerufen.

    PS: Und Du bist sicher, dass der Leak-Dump nicht *vor* dem destructor aufgerufen wird?

    was hätte das denn für eione Aussage? Ein Leak-Dump sollte doch global warten, ob evt. doch der Speicher wieder freigegeben wird.

    Davon abgesehen klappt es nicht einmal wenn ich die Variable der Funktion:

    void CaptureTableDescription( int index, TABLE_DESCRIPTION &pTableDescription )
    {
    ..
    }
    

    übergebe. Sobald ich std::string verändere wird ein Leak ausgegeben. Intressant ist auch, dass ich in der Struktur auch integer werte setze, die kein Leak verursachen.



  • Du machst das ganze aber nicht über EXE/DLL-Grenzen hinweg, oder? Bzw. Du verwendest sonst keine EXE/DLLs, welche diese Struktur noch verwendet, oder?



  • Naja, ich habe eine MFC Anwendung. Dort rufe ich diese FUnktionen auf. (eig. recht simple)



  • Könnte das evt. an der Einstellung "MFC Shared DLL " liegen?



  • Ohne mehr Infos kann ich leider nichts dazu sagen... oder mail mir doch mal das Projekt...


Anmelden zum Antworten