Hace un tiempo me dijeron que era un lugar común para usar std :: vector como una matriz dinámica segura de excepción en C++ en lugar de asignar matrices sin formato ... por ejemploUsando operator [] en empty std :: vector
{
std::vector<char> scoped_array (size);
char* pointer = &scoped_array[0];
//do work
} // exception safe deallocation
he utilizado esta convención varias veces sin problemas, sin embargo, recientemente portado algo de código para Win32 VisualStudio2010 (antes era sólo en MacOS/Linux) y mis pruebas unitarias están rompiendo (stdlib emite una afirmar) cuando el tamaño del vector es cero.
Entiendo que escribir en una matriz de este tipo sería un problema, pero esta suposición rompe esta solución como un reemplazo de los punteros sin formato. Considere las siguientes funciones con n = 0
void foo (int n) {
char* raw_array = new char[n];
char* pointer = raw_array;
file.read (pointer , n);
for (int i = 0; i < n; ++i) {
//do something
}
delete[] raw_array;
}
Si bien podría decirse redundante, el código anterior es perfectamente legal (creo), mientras que el código de abajo va a lanzar una afirmación en VisualStudio2010
void foo (int n) {
std::vector<char> scoped_array (n);
char* pointer = &scoped_array[0];
file.read (pointer , n);
for (int i = 0; i < n; ++i) {
//do something
}
}
Era Estoy usando un comportamiento indefinido todo el tiempo? Yo tenía la impresión de operador [] hizo ninguna comprobación de errores, y esto era un uso válido de std :: vector <>. ¿Alquien más se ha encontrado con este problema?
--edit: Gracias por todas las respuestas útiles, en respuesta a la gente diciendo que es un comportamiento indefinido. ¿Hay alguna forma de reemplazar la asignación de matrices sin formato que se encuentra arriba con n = 0?
Si bien decir que la comprobación de n = 0 como caso excepcional se resolverá el problema (lo hará). Hay muchos patrones que no se necesita caso especial (como el ejemplo puntero del crudo por encima) así que tal vez utilizando algo más que std :: vector <> serían necesarios?
¿Qué excepción se produce? No veo nada malo con el código. – fschmitt
@fschmitt: si el vector está vacío, 'scoped_array [0]' proporciona un comportamiento indefinido. En este caso, construir una variante de depuración con Visual C++, falla una comprobación de rango y arroja una excepción. –
@fschmitt: La implementación de Visual Studio de std :: vector desencadena una afirmación (es decir, mata todo el proceso de forma inmediata) con un error que indica que hubo un error de fuera de límites en el vector. – Akusete