Problem mit std::cin und delete
-
Ich habe ein Problem mit std::cin. Wenn ich den code solo in main() unterbringe, funktioniert er wie erwartet. Wenn ich ihn in ein anderes Program einfüger, wirds anstandslos kompeliert, führt aber zu einem "segmentation fault", wenn die Eingabe nicht leer ist.
Was funktioniert:
#include <iostream> int main(int argc, char** argv) { //der in einem anderen programm problematische code: char* tmp; std::cin >> tmp; return 0;}Vll. damit zusammenhängend: Ich habe ein dynamisches Objekt und kurz vor programm-ende einen delete-aufruf. Weil danach nur noch ein return aus main stattfindet, das Objekt also ganz sicher nicht vorher wo anders gelöscht wird, scheidet der Fehler "doppeltes delete" und "zugriff auf gelöschtes Objekt" aus.
Was für weitere Fehler-Quellen fallen euch ein? Wie kann obenstehender code durch einen vorherigen Fehler (Es sei denn das prog ist ohne Fehler falsch?) beeinträchtigt werden. Zum posten des gesamten codes scheint mir der code zu umfangreich.
Irgendwelche Ideen?
mfg -gorgoyle
-
Wahrscheinlichste Fehlerquelle: Du hast keinen Speicher für tmp allokiert.
-
Glückwunsch, dein Zeiger zeigt ins Nirvana.
-
#include <iostream> #include <string> int main(int argc, char** argv) { //der in einem anderen programm problematische code: std::string tmp; std::cin >> tmp; return 0;}dann hast du die zeiger problemeatik nicht (und der wurde bei dir nie initialisiert, zumindest zeigt er sonst wohin, aber auf kein gültiges objekt)
-
(1)
char* tmp = " ";funzt net ..
(2)char* tmp = char[4];funzt!
Gibt es eine kurze Erklärung dafür, warum (1) nicht funktioniert?
@Muffmolch Das beantwortet wohl die Frage, wie man wirkungsvoll Pufferüberläufe verhindern kann oder irre ich mich?Danke für eure Hilfe!
-
eigentlich sollte 2 auch so nicht gemacht werden

Naja ... du musst halt einen groß genuchen Speicher allokieren ... was eigentlich mit new gemacht wird ... und den am Ende wieder mit delete freigeben ... das macht die std::string klasse alles für dich und noch vieles mehr ...
#include <iostream> #include <string> int main() { std::cout << "Test V1.0" << std::endl; std::string test; std::getline(std::cin, test); // Da holen wir uns sogar die ganze Zeile ;) }