<$BlogRSDUrl$>

Esos aparatos del demonio

Mis notas sobre lo que voy leyendo de ordenadores y periféricos

martes, noviembre 15, 2005

El nuevo operador new 


Yo soy de la vieja escuela. Creo que con decir que en la carrera media estudié Cobol está todo dicho. Así que hay novedades de las que tardo un poco en enterarme. Por ejemplo, lo del new.

El libro de referencia que tengo de C++ es "El lenguaje de programación C++" de Bjarne Stroustrup, pero el de la época de la carrera: una segunda edición de 1993. Hace doce años. De la versión en español.

De aquella, cuando se llamaba al operador new y no había memoria suficiente, devolvía NULL. Hace un poco un compañero me comentó que eso había cambiado y que ahora lanza la excepción std::bad_alloc. Al menos eso especifica el estándar desde 1998. Y que si quieres que funcione como toda la vida (devolviendo NULL), tienes que poner new(std::nothrow) en vez de sólo new.

Vale. Hasta aquí más o menos claro. Pero ahora empieza lo bueno: el soporte del compilador.

Como todos sabemos, los estándares son los estándares y los compiladores hacen con ellos lo que buenamente pueden.

Lo que hace Visual C++ viene explicado en este artículo. Resumiendo mucho: a partir de Visual C++ .NET 2002, tiene dos versiones; una, la del CRT (en libc.lib, libcd.lib, libcmt.lib, libcmtd.lib, msvcrt.lib y msvcrtd.lib), que devuelve NULL. Otra, la de la librería estándar de C++ (en libcp.lib, libcpd.lib, libcpmt.lib, libcpmtd.lib, msvcprt.lib y msvcprtd.lib), que lanza una excepción. Dependiendo de cuál esté primero a la hora de enlazar, se utilizará una versión u otra.

Lo más gracioso es que cuál se utilice depende en parte de los includes. Si se utilizan sólo cabeceras estándar de C++ (las que no tienen .h, como por ejemplo #include <new>), se utilizará la opción /defaultlib, que hará que se utilice la versión del CRT o la estándar dependiendo de las opciones /M*. Lo habitual será que se utilice la versión de new que lanza excepciones porque aparecerá antes la librería correspondiente en la orden de enlazado.

¿Y qué ocurre en g++? Pues que lanza excepciones. No sé desde que versión, pero probablemente desde la 2.96 por lo menos.

Es muy interesante este mensaje en las news. Trata precisamente el problema de la gente que no sabe lo que pasa con el new. Al final se ponen filosóficos. El autor original del hilo intenta esclarecer qué hacer con los ingenieros que no se actualizan y no saben que new lanza una excepción. Pero como le dice uno después, lo de que lanza una excepción es lo que dice el estándar y:


[...] the difference between an engineer and a scientist is that the engineer considers the practical aspects. In this case, the engineer will look at what his compiler does, whereas the scientist will read the standard :-)

The engineer will do a cost-benefits analysis as to whether to use a new feature, the scientist will generally try to maximize the benefits without too much regards to the cost.

And of course, most developers programming in C++ are probably neither computer scientists nor software engineers, but simply programmers, trying to get the job done that they were told to do, using the tools that they were given.


Complicado problema. Así que, como decía el Fari: «Precaución, amigo programador».

Comentarios:

This page is powered by Blogger. Isn't yours?

Blogroll
Enlaces
Archivos

Licencia Creative Commons
Este trabajo tiene licencia Creative Commons License.