2011-09-26 15 views
6

Hay tal código:operador nuevo con la opción nothrow todavía lanza excepción

#include <iostream> 

int main(){ 
    for(;;){ 
     int* ptr = new (std::nothrow) int; 
     if(ptr == 0){ 
      std::cout << 0 << std::endl; 
      break; 
     } 
    } 
    std::cin.get(); 
    return 0; 
} 

Sin embargo, este programa todavía lanza excepción std :: bac_alloc, Altough nueva se llama con std :: nothrow parámetro. Este programa está compilado en Visual C++ 2010. ¿Por qué se lanza la excepción?

Editar:

Con g ++ en Windows desde MinGW, todo funciona bien.

+0

Este programa no debe compilarse. Es una pena que lo haga. Debería agregar '#include '. De todos modos, ¿qué versión de VC++ estás usando? –

+0

Bueno, lo hace. Versión del año 2010. – scdmb

+0

También compila en gcc. ¿Qué demonios me hizo creer que sería una buena idea ejecutarlo realmente? – pmr

Respuesta

1

Acabo de ejecutar su muestra de VC2010. No es nuevo (nothrow) que arroja, pero __security_check_cookie.

+0

Hmm, que parece ser un error de compilación en ese momento. – MSalters

-2

This explica por qué todavía está lanzando y cómo puede hacerlo no tirar. Parece que nothrow simplemente se ignora.

Si aún desea la versión nueva de C Runtime Library, enlace su programa con nothrownew.obj. Sin embargo, cuando se vincula con nothrownew.obj, lo nuevo en la biblioteca estándar de C++ ya no funcionará.

Encontré un artículo bastante profundo sobre esto pero está un poco anticuado (VC 6) pero quizás el problema aún persiste. BTW VC ignora todas las especificaciones de funciones de throw().

When Operator new(std::nothrow) Throws an Exception Anyway

+0

Esa página parece hablar sobre el 'operador' normal 'nuevo' (' nueva X' en oposición a 'nueva (std :: nothrow) X'), mientras que la pregunta es específicamente sobre la última. – NPE

+0

Eso se refiere específicamente al 'nuevo' 'normal'. Consulte http://blogs.msdn.com/b/stevejs/archive/2005/11/01/487776.aspx para obtener una explicación. – MSalters

7

0 tiene que ser formateado como "0". Eso tomará algunos bytes; Apuesto a que esa es la causa. Ponga un punto de interrupción en std::bad_alloc::bad_alloc y sabrá con certeza.

+0

O coloque un bloque try-catch alrededor de lo nuevo y un bloque try-catch alrededor de toda la función para saber si realmente es el 'nuevo' el que falla o no. –

+1

Aún mejor, verifique la opción de romper con una excepción de C++ lanzada. –

Cuestiones relacionadas