Pregunta

Estoy tratando de averiguar si el boost::multi_array constructor o cambiar el tamaño de método puede lanzar una excepción bad_alloc (o alguna otra excepción que indica la asignación o cambiar el tamaño de error).No puedo encontrar esta información en la documentación en cualquier lugar.

Aclaración (añadido de comentarios):

Este es un científico algoritmo que puede caer a menos intensivo de memoria (más lento) método si la asignación de falla.Básicamente hay dos asignada dinámicamente 3 dimensiones de las matrices para mantener "distancias" (correlación) entre todos los pares de genes en una consulta y todos los genes en una cruz-conjunto de validación para cada uno de un gran número de conjuntos de datos.El método más lento se vuelve a calcular cada distancia sobre la marcha a medida que se necesiten.Esta es una versión de C++ de una ya existente implementación de Java, que pone en práctica los métodos y cayó en un fuera de la excepción de memoria.Yo realmente no esperar a que se ejecute fuera de la memoria.

¿Fue útil?

Solución

primero: (responder a la pregunta real): Como se utiliza la memoria asignada dinámicamente, sí, se puede tirar std::bad_alloc (nunca he visto excepciones std::bad_alloc traducción impulso, sino que sería una locura hacerlo) .

segundo: (comentario en su aclaración): Usted necesita la información de la memoria física disponible para optimizar el rendimiento de su algoritmo en tiempo de ejecución. Sin embargo, no se puede confiar en std::bad_alloc para determinar la cantidad de memoria que tiene disponible, como los sistemas operativos modernos usan una cosa tal como overcommit , que significa: que (casi) nunca se devuelven un intento de asignación fallado, pero en su lugar sólo darle un poco de "memoria", que sólo dejará de saltar a la existencia cuando en realidad se intenta acceder a él.

En Java esto puede funcionar como la máquina virtual está haciendo muchas cosas para usted: se trata de asignar algunos trozos de memoria continuas, y lo hace con respecto a la memoria física disponible, y la disposición sin usar física memoria para decidir si se debe insistir en la GC más o simplemente asignar una basura más grande. Además, por razones de rendimiento que necesita para tener en cuenta que la memoria virtual y memoria física son bastante diferentes conceptos.

Si necesidad para el rendimiento Optimizar que los algoritmos para estos casos (que bien puede ser necesario, dependiendo de su área de trabajo), hay que fijarse en sus funciones específicas de la plataforma que puede decirle cómo se ve "el mundo real" como.

Otros consejos

La ausencia de excepción explícita de la especificación es intencional.Ver este sub-sección para obtener una explicación.Además, tenga en cuenta que la ausencia explícita de una especificación significa que no hay ninguna restricción sobre el tipo de excepción que una función puede lanzar.Así, al menos, el cto r y la función de cambiar el tamaño puede lanzar excepciones en el caso de que la memoria se agota, o si un elemento-objeto de copia falla.

Algunas referencias genéricas que inspiró Impulso que usted puede estar interesado en son:

¿Por qué no probarlo? Es fácil pasar un valor absurdamente alto para generar la excepción.

Por otra parte, ¿qué planea hacer si lo hace generar esta excepción? std::bad_alloc es el tipo de excepción que por lo general no puede hacer frente a nivel micro ...

Por ejemplo, en un servidor web, lo más habitual es realizar alguna tarea de limpieza (rollback de la transacción db?) Y luego devolver un error 500 al usuario.

Sin embargo, cuando se agota la memoria, no hay mucho que se pueda hacer con seguridad, ya que hay que ir con cuidado si no quiere una vez más contra la pared de memoria que usted conoce está cerca:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top