Vector out of bounce

06/04/2013 18:09 Hiris#1
Code:
	    try
		{
           return  MapContainer.at(index) ;
        }
        catch (std::exception& e)
		{

            std::cout << "Element " << index << ": index exceeds vector dimensions." << std::endl;

        }

vector.at ist doch sicher? Warum throwt er sich da einen wenn man index als 1 nimmt anstelle von 0 (ist nur 1 objekt im vector), ist ja nur out of bounce und dafür ist die exception ja prädestiniert oder?
06/04/2013 18:29 snow#2
Ne, std::vector::at wirft ne Exception, std::vector::operator[] erstellt ein neues leeres Element, wenn man z.B. über die Size hinaus auf Elemente zugreifen will.
06/04/2013 18:35 Hiris#3
Ja die exception wird aber nicht gecatched sondern es kommt eine box alla unberechtigter zugriff auf blablabla
06/04/2013 20:00 Padmak#4
Tu doch bitte der Performance einen Gefallen und überprüf das schlichtweg:
Code:
if(MapContainer.size() > index)
{
    return MapContainer.at(index);
}
Exceptions sind nur dazu da, außergewöhnliche Fehler abzufangen. Solche Sachen solltest du eigentlich immer vorher überprüfen, finde ich zumindest
Hast du das Programm überhaupt mit Exception Handling compiled?

€: Außerdem heißt das out of bounds und nich out of bounce :D

Padmak
06/04/2013 20:09 Schlüsselbein#5
Lass das try catch und check in ner Abfrage, ob der Index im richtigen Bereich liegt. Das ist wesentlich schöner und Exceptions sind sowieso immer so ne Sache.

Lass ausserdem das return im try-block weg. Return danach, denn jeder Pfad muss etwas zurückgeben und das passiert bei dir nicht.

Wenn du trotzdem unbedingt die Exception haben willst:
Code:
#include <exception>
#include <iostream>
#include <vector>

int main()
{
	std::vector<int> vec;
	for(int i = 0; i < 10; ++i)
		vec.push_back(i);

	try
	{
		int x = vec.at(10);
	}
	catch(std::exception& e)
	{
		std::cerr << e.what();
	}
}
Das wirft bei mir. Welchen Compiler benutzt du? Probiers mal im release-build.


Quote:
std::vector:perator[] erstellt ein neues leeres Element, wenn man z.B. über die Size hinaus auf Elemente zugreifen will.
Nein tut es nicht.
06/04/2013 20:40 Hiris#6
vs 2012 ultimate release version...
ich weiß das man es ohne exception machen kann, trotzdem dürfte es rein theoretisch die exception catchen, was es bei mir aus unerfindlichen Gründen nicht tut, alle anderen Exception´s werden normal gecatched und liegt definitiv an der stelle, habs mit breakpoints getestet :/ darum wunderts mich ôo
06/04/2013 21:25 Schlüsselbein#7
Zeig mal den kompletten Code der Routine.
06/05/2013 00:49 Delinquenz#8
Habs mal getestet:
GCC 4.7.2: vector::_M_range_check
MSVC 2012: invalid vector<T> subscript