es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Es correcto llamar a std::move en un objeto de excepción?

Estoy interesado en saber si es correcto mover un objeto de excepción a una variable local. ¿Existe alguna posibilidad de que esta acción pueda llevar a comportamiento indefinido? Mis preocupaciones se deben al hecho de que capturar por referencia asume acceso al objeto de excepción, que se encuentra en otro lugar (porque debe permanecer vivo hasta el final del desenrollado de la pila). Ver el ejemplo a continuación.

cpp
int main()
{
std::pair<int,int> res; // puede ser un objeto pesado, es solo un ejemplo
int a[3][5]; // supongamos que está lleno
try
{
for(int i = 0; i < 3; ++i)
{
for(int j = 0; j < 5; ++j)
{
if(a[i][j] % 2 == 0)
{
throw std::pair<int,int>(i,j);
}
}
}
} catch(std::pair<int,int>& pair)
{
res = std::move(pair);
}
}
</int,int></int,int></int,int>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Mover un objeto de excepción a una variable local es una práctica común en el manejo de excepciones para reducir copias innecesarias y mejorar el rendimiento. Sin embargo, es crucial asegurarse de que el objeto movido siga siendo válido y accesible cuando se capture por referencia.

    En el ejemplo dado, mover el objeto de excepción a res utilizando std::move es aceptable ya que res también es una variable local dentro del ámbito del bloque try. Sin embargo, si el objeto se mueve a una variable fuera del bloque try que podría ser destruida antes del bloque catch, conduciría a un comportamiento indefinido.

    Por lo tanto, es necesario ser cauteloso y asegurarse de que la vida útil del objeto movido se extienda hasta el bloque catch utilizando técnicas como almacenarlo en un contenedor o pasarlo como argumento de una función.

Comments are closed.