1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
407
407
EMPFEHLEN
-
01.03.10 11:31 #1
- Registriert seit
- Apr 2005
- Beiträge
- 191
Hallo zusammen,
der unten gezeigte Code-Schnipsel reagiert merkwürdig. Ich möchte möglichst am Stück Speicher reservieren. Wenn das nicht möglich ist, dann die Hälfte.
Wenn das auch nicht möglich ist, dann ein Viertel, usw. Beim Test mit zu großem n springt die Routine auch wie beabsichtigt in den catch-Block. Aber danach geht es nicht etwa im try-Block weiter, sondern es wird eine weitere Ausnahme geworfen namens "privileged instruction". Was stimmt denn da nicht?
Info: facemap ist eine std::map und freefaces ein std::vector.
Code :1 2 3 4 5 6 7 8 9
FaceMap::size_type n(facemap.size()); while (true) { try { freefaces.reserve(n); break; } catch (bad_alloc) { n /= 2; } }Grüße OS
-
01.03.10 11:41 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Die std::vector resize() Methode deiner verwendeten STL Implementierung scheint nicht exception-safe zu sein.
Versuch's mal so:Welchen Compiler verwendest du denn? Ist das Verhalten mit einem Minimalbeispiel nachvollziehbar?Code cpp:1 2 3 4 5 6 7 8 9 10
FaceMap::size_type n(facemap.size()); while (true) { try { std::vector v(n); freefaces.swap(v); break; } catch (bad_alloc) { n /= 2; } }
Gruß
PS: Du solltest übrigens grundlegend Ausnahmen immer by-reference fangen, nicht unbedingt by-value.Geändert von deepthroat (01.03.10 um 11:48 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
01.03.10 12:17 #3
- Registriert seit
- Apr 2005
- Beiträge
- 191
Mein Rechner geht z.B. bei folgenden Beispiel in die Knie. Ich habe 2 GB RAM, Win XP 32, Visual C++ 2005 Prof.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14
struct test { double v[1000]; // Hauptsache verschwenderisch }; vector<test> vec; size_t n = 1000000; while (true) { try { vec.reserve(n); break; } catch (const bad_alloc&) { n /= 2; } }Grüße OS
-
01.03.10 12:24 #4
- Registriert seit
- Apr 2005
- Beiträge
- 191
Hmm, wenn ich catch(...) verwende, scheint es zu klappen.
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14
struct test { double v[1000]; // Hauptsache verschwenderisch }; vector<test> vec; size_t n = 1000000; while (true) { try { vec.reserve(n); break; } catch (...) { n /= 2; } }
Grüße OS
-
01.03.10 12:32 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Das liegt aber dann nicht an einer "privileged instruction" Ausnahme, sondern einfach daran, das du versucht hast mehr als die maximale Anzahl von Elementen des Vektors zu reservieren (std::length_error).
GrußCode cpp:1
vec.reserve(std::min(n, vec.max_size()));
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
01.03.10 13:45 #6
- Registriert seit
- Apr 2005
- Beiträge
- 191
Mit dieser Variante bin ich nun zufrieden.Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include <vector> using namespace std; struct test { double v[1000]; // Hauptsache verschwenderisch }; vector<test> vec; size_t n = 1000000; while ( true ) { try { vec.reserve( min( n, vec.max_size() ) ); break; } catch ( const bad_alloc& ) { n /= 2; } }
length_error() kann gar nicht erst auftreten und andere Ausnahmen als bad_alloc werden nicht behandelt. Schließlich sind nicht alle erdenklichen Ausnahmen durch n /= 2 zu lösen.
Vielen Dank!Grüße OS
Ähnliche Themen
-
Lesen des streams (sdtout) eines externen Prozesses, der eine Exception wirft
Von DarthShader im Forum JavaAntworten: 17Letzter Beitrag: 18.05.09, 15:00 -
GDI+ Exception bei PicBox.Image.Save - warum?
Von Asterix-Ac im Forum .NET ArchivAntworten: 3Letzter Beitrag: 08.11.07, 15:32 -
JBoss mit MySql, boolean-Spalte wirft Exception
Von turbowiesel im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 0Letzter Beitrag: 27.12.06, 22:12 -
ListBox wirft Exception (schwer)
Von Rippa_HD im Forum .NET ArchivAntworten: 1Letzter Beitrag: 08.05.04, 11:31 -
An unhandled exception - Doch warum
Von Konstantin Gross im Forum .NET ArchivAntworten: 7Letzter Beitrag: 09.03.04, 22:03





Zitieren
Login






