Wo ist der leak?



  • Ich hab folgende Situation:

    class Foo
    {
      Foo(int argc, char * argv[]) {f_.argc = argc; f_.argv=argv;}
    
      struct f
      {
        int argc;
        char ** argv;
      }f_;
    };
    

    Und erzeuge ein Testobjekt:

    char * argv[] = {"help", "second"};
        Foo g(2,argv);
    

    http://codepad.org/RdeT0zK3

    Mir ist zu einem klar, dass gcc ein Warning wirft, weil ich kein const char habe, was kann man da tun?

    Zum anderen benötige ich in Foo argv in der form, wie es ist noch mehrere male. Aber Boost hat nen Leak entdeckt und wirft mir:

    Dumping objects ->
    {270} normal block at 0x01307E58, 24 bytes long.
     Data: <                > 00 CD CD CD 00 00 00 00 00 00 00 00 00 00 00 00
    {269} normal block at 0x01307DC0, 104 bytes long.
     Data: <  #g }0      U2g> 9C B2 23 67 88 7D 30 01 00 00 00 00 E8 55 32 67
    {268} normal block at 0x01307D88, 8 bytes long.
     Data: <  #g }0 > A8 B2 23 67 C0 7D 30 01
    {267} normal block at 0x01307D40, 24 bytes long.
     Data: <                > 00 CD CD CD 00 00 00 00 00 00 00 00 00 00 00 00
    {266} normal block at 0x01307CF8, 24 bytes long.
     Data: <                > 00 CD CD CD 00 00 00 00 00 00 00 00 00 00 00 00
    {265} normal block at 0x01307C90, 56 bytes long.
     Data: <     }0         > 01 00 00 00 88 7D 30 01 00 CD CD CD 00 00 00 00
    Object dump complete.
    

    Die Parameter stammen in der Regel aus der main, beim Test jedoch nicht.

    Muss ich diese manuell reservieren, damit ich derartige probleme nicht habe?



  • Seikilos schrieb:

    ...
    Mir ist zu einem klar, dass gcc ein Warning wirft, weil ich kein const char habe, was kann man da tun?...

    😕
    const machen, was const sein muss.

    Ich befürchte, ich verstehe Dein Problem nicht...

    Seikilos schrieb:

    ...
    Zum anderen benötige ich in Foo argv in der form, wie es ist noch mehrere male. Aber Boost hat nen Leak entdeckt und wirft mir: ...

    Mir scheint, Du fragst hier zu anderem Code als Du zitiert hast.

    Gruß,

    Simon2.



  • aber es wird von int main ja auch nicht als const übergeben



  • Seikilos schrieb:

    aber es wird von int main ja auch nicht als const übergeben

    Stört aber nicht ... in der Richtung ist die Zuweisung ja erlaubt.
    Und ziemlich sicher sind Schreibzugriffe auf "argc und argv von main" nicht erlaubt (auch wenn die Variable aus häßlichen "früher-mal"-Gründen nicht als const deklariert sind) - also quasi "intern const" 😉

    Gruß,

    Simon2.



  • Boost hat aber eine Funktion, die ein nicht-const char* [] erwartet.

    Kann ich überhaupt ein char * argv[] als member deklarieren? auch wenn ich von mir aus alles dort dynamisch alloziiere?



  • Seikilos schrieb:

    Boost hat aber eine Funktion, die ein nicht-const char* [] erwartet.

    Ist ja auch kein Problem, da Du nirgends einen const char* hast.

    Wenn Du eine hilfreiche Antwort möchtest, solltest Du uns vielleicht mal sagen was für eine Warnung und wo sie geworfen wird.

    BTW:
    Die Leak-Anzeige kommt vom Visual Studio.



  • Keine Warnung, sondern der Memory Leak da oben.
    Funktionell geht alles, aber mein Boost::Test wirft mir dem Memory Leak



  • Seikilos schrieb:

    Keine Warnung, sondern der Memory Leak da oben.
    Funktionell geht alles, aber mein Boost::Test wirft mir dem Memory Leak

    Ja und aus welcher Zeile stammt der Leak?



  • Steht keine Zeile.

    Hab rausgefunden, dass Qt Objekte in Boost::Test Leak Meldungen verursachen.

    Problem gelöst, danke



  • Du kannst der VS-Debug-Runtime dazu mitteilen, daß sie die Zeilennummer und Filename mit im DumpLeak ausgibt. Einfach diesbezüglich mal googlen! Das macht das Finden der Leaks einfacher!

    Gruß Kimmi



  • Also was du da laberst ist Quark, dein Code erst recht!

    f_.argv=argv;
    

    Geht mit Sicherheit nicht, du kannst doch nicht einfach char-Zeiger rumreichen, wie du willst! Nimm strcpy! 🙄



  • _D_D_D_D schrieb:

    ...Geht mit Sicherheit nicht, ...

    Ich halte dagegen.

    _D_D_D_D schrieb:

    Also was du da laberst ist Quark, ....

    Wer soll sich bei dem Tonfall überzeugen lassen? Kinderkram.

    Gruß,

    Simon2.



  • Wieso soll das nicht gehen? Klar kann ich einen Zeiger rumreichen und mir sind die Gefahren klar, aber hier kein Problem



  • Bitte löschen



  • benutze dafür strcpy oder verwandte.
    simon


Anmelden zum Antworten