Ich versuche, eine Zeichenfolge an eine andere anzuhängen. Ich deklariere zwei globale String-Variablen -Valgrind beschwert sich auf string.append (string)
Dann habe ich eine Funktion zum Abrufen von Befehlszeilenargumenten. Wann immer ein Benutzer einen Dateinamen in ein Befehlszeilenargument eingibt, sollte er im Ruhezustand gespeichert werden, und dann wird rest an grid_filename angehängt.
else if(strcmp(temp.substr(0,16).c_str(), "--grid-filename=") == 0) {
rest = temp.substr(16,strlen(temp.c_str())-16);
grid_filename.append(rest); //line 74!
}
Nun, wenn ich meinen Code ausführen, gibt valgrind mir diesen Fehler -
==5602== Address 0x45fdc30 is 0 bytes after a block of size 32 alloc'd
==5602== at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
==5602== by 0x43039F7: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x4304C77: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x4304DA6: std::string::reserve(unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x43053E9: std::string::append(std::string const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x804D5AE: get_command_line_args(int, char**) (main.cpp:74)
==5602== by 0x804F138: main (main.cpp:244)
ich drucken die beiden Adressen der Saiten und keiner von ihnen entsprechen derjenige valgrind sagt 0 Byte ist. Was fehlt mir hier?
Ich glaube, das führt zu meinem zweiten Fehler, weil ich Grid_filename an eine andere Funktion übergeben, die die Zeichenfolge über eine TCP-Verbindung sendet. Valgrind sagt mir
==5660== Syscall param socketcall.send(msg) points to unaddressable byte(s)
==5660== at 0x404A9B1: send (socket.S:64)
==5660== by 0x804F7C8: main (main.cpp:364)
Kann mir jemand erklären, was das Problem ist? Jede Hilfe wäre willkommen. Ich kann bei Bedarf mehr über den Code liefern.
Güte! ...... –
Die erste Fehlermeldung, die Sie eingeben, ist nicht vollständig. Die echte Fehlermeldung muss direkt über dem Text sein, den Sie eingefügt haben, etwas über das Lesen oder Schreiben in 0x45fdc30. Dann druckt valgrind die Nachricht, die Sie eingefügt haben, und sagt Ihnen etwas über diese Adresse. – wolfgang
Die zweite Fehlermeldung, die ich gepostet habe, tritt direkt über der ersten, die ich gepostet habe, auf. Ich dachte, dass sie getrennt waren, also schrieb ich separat über sie. Die gesamte Nachricht sollte mit dem "Syscall param socketcall.send (msg) auf nicht adressierbare Byte (s)" gefolgt von der "Adresse 0x45fdc30 ist 0 Bytes nach einem Block der Größe 32 zugewiesen" Nachricht beginnen. – Sterling