Speicher beschränkt nach std::copy?

Hallo!

Der Taskmanager zeigt mir an (in der Spalte "Virtueller Speicher"):
Vor Tastendruck: 118'992 K
Nach Tastedruck( Exception): 118'992 K

Die Funktion wird nur einmal aufgerufen, ich habe eine Ausgabe eintsprechend zur Überprüfung eingebaut.

Die Aktionen mit dem Vektor habe ich mal sämtlich auskommentiert, also 0 Elemente im Vektor und der Fehler bleibt weiterhin bestehen.
 
Das mit dem Beispiel wird wirklich schwer. Ich bin jetzt seit 3 Stunden daran ein compilierbares Minimalbeispiel zu machen und erst auf 178 Fehlern runter. Ich arbeite mal daran weiter, aber vielleicht kommt euch ja noch was in den Sinn ;)

//Edit:
Ich habe weiter den Debugger verwendet und jetzt mal vor der fraglichen Allozierung, welche eine Exception wirft eine Ausgabe der Grösse sowie ein return eingebaut.

Ausgegeben wird: 0. Ausserdem bekomme ich folgende "Exception":
"Windows has triggered a breakpoint in Viewer.exe.

This my be due to a curruption of the heap, which indicates a bug in Viewer.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while Viewer.exe has focus."

Das Output-Fenster gibt zudem an:
"HEAP[Viewer.exe]: Heap block at 07234770 modified at 07236168 past requested size of 19f0".

Ich werde das mal weiter verfolgen!

//Edit3:
Mittlerweile habe ich die Funktion soweit gebracht, dass sie nicht mehr eine bad_alloc-Exception wirft indem ich alle Schreibvorgänge auskommentiert habe. Offensichtlich verändert einer der Vorgänge Speicher ausserhalb seines Bereiches und das manifestiert sich dann erst später. Ich werde jetzt schauen, welcher Teil das ist und warum.

//Edit4:
Offensichtlich ist das Problem bei den 3 Stringchunks. std::max_element + länge des letzten String scheinen irgendwie kleiner zu sein als der tatsächlich nötige Speicherplatz!

Gruss
Cromon
 
Zuletzt bearbeitet:
Ok, alles behoben nun, ich verwende jetzt nicht mehr std::max_element um die nötige Länge des Strings herauszufinden, denn diese berücksichtigt die \0 nicht, sondern ich gehe alle strings durch und rechne ihre Grösse hoch. Damit funktioniert alles einwandfrei. Echt erstaunlich, dass sich eine Zugriffsverletzung in einer std::bad_alloc - Exception manifestiert hat, allerdings erst nachdem ich das zweite mal über die Speichergrenzen geschrieben habe.

Thema erldigt. Vielleicht könnte ein Moderator noch den Titel ändern, da es ja wirklich überhaupt nichts mit std::copy zu tun hatte am Ende :D

Gruss und Dank an alle Beteiligten
Cromon
 
Ok, alles behoben nun, ich verwende jetzt nicht mehr std::max_element um die nötige Länge des Strings herauszufinden, denn diese berücksichtigt die \0 nicht, sondern ich gehe alle strings durch und rechne ihre Grösse hoch.
Erstens hättest du die std::max_element Funktion gar nicht aufrufen müssen, denn da eine std::map sortiert ist, ist das max. Element immer das letzte (map::rbegin()).

Außerdem ist map.size() == Anzahl der Elemente == Anzahl der notwendigen Terminierungszeichen.

Gruß
 
Hallo!

Ja, das ist mir gestern Nacht auch noch in den Sinn gekommen ;). Funktioniert soweit jetzt alles wunschgemäss!

Gruss
Cromon
 
Zurück