Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: erest0r en 11 Septiembre 2013, 06:25 am



Título: Duda sobre memoria dinamica C++
Publicado por: erest0r en 11 Septiembre 2013, 06:25 am
Buenas noches, acabo de notar que cuando creo una memoria dinamica usando new[], no tengo necesidad de usar el encabezado <new>, pero en una pagina de C++ indica que ésta es necesaria para invocar ese metodo: http://www.cplusplus.com/reference/new/  , aqui tienen mi codigo y veran que funciona perfectamente sin la cabecera <new>

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main( int argc, char* args[] )
  6. {
  7.    int *arreglo;
  8.    int cantidad, i, a = 0;
  9.    cout << "Ingrese el tamaño del arreglo: ";
  10.    cin >> cantidad;
  11.    // El metodo nothrow permite que el programa se siga ejecutando incluso si el puntero recibe un parametro invalido
  12.    arreglo = new (nothrow) int [cantidad];
  13.    if( arreglo == 0)
  14.        cout << "Error, no se pudo asignar memoria" << endl;
  15.    else
  16.        for( i = 0; i < cantidad; i++ )
  17.        {
  18.            arreglo[i] = a;
  19.            a++;
  20.            cout << arreglo[i] << endl;
  21.        }
  22.    // El operador delete sirve para liberar la memoria dinamica utilizada
  23.    delete [] arreglo;
  24.    cin.get();
  25. return 0;
  26. }
  27.  
  28.  

¿Sera que ya no es necesario usar esa cabecera? Que alguien me explique que diferencia hay entre usarla o no, por favor, gracias.


Título: Re: Duda sobre memoria dinamica C++
Publicado por: rir3760 en 11 Septiembre 2013, 08:12 am
En la pagina que mencionas se explica porque no es necesaria la inclusión de ese encabezado, por ejemplo en la pagina sobre el operador new (http://www.cplusplus.com/reference/new/operator%20new/):
Citar
The default allocation and deallocation functions are special components of the standard library; They have the following unique properties:

* Global: All three versions of operator new are declared in the global namespace, not within the std namespace.

* Implicit: The allocating versions ((1) and (2)) are implicitly declared in every translation unit of a C++ program, no matter whether header <new> is included or not.

* Replaceable: The allocating versions ((1) and (2)) are also replaceable: A program may provide its own definition that replaces the one provided by default to produce the result described above, or can overload it for specific types.

Un saludo


Título: Re: Duda sobre memoria dinamica C++
Publicado por: erest0r en 11 Septiembre 2013, 08:22 am
Muchas gracias, me salte ese pedazo, aunque igual creo que empezare a incluir ese encabezado de manera que se vea mas formal el codigo  :)


Título: Re: Duda sobre memoria dinamica C++
Publicado por: eferion en 11 Septiembre 2013, 08:30 am
Muchas gracias, me salte ese pedazo, aunque igual creo que empezare a incluir ese encabezado de manera que se vea mas formal el codigo  :)

Dudo que encuentres muchos códigos fuente en los que se incluya la susodicha cabecera.

El operador new está disponible siempre en todo el código fuente y por esa razón no se incluye su cabecera por defecto.


Título: Re: Duda sobre memoria dinamica C++
Publicado por: erest0r en 11 Septiembre 2013, 09:06 am
Muchas gracias, si es asi, ¿existe algun otro operador el cual no haya necesidad de incluir su cabecera?


Título: Re: Duda sobre memoria dinamica C++
Publicado por: eferion en 11 Septiembre 2013, 09:13 am
No te preocupes por cosas como estas.

Lo ideal es que solamente añadas un include cuando el compilador te lo pida.

En proyectos pequeños es más o menos fácil saber que includes tienes que añadir en cada archivo... pero conforme el proyecto crece y se van creando dependencias entre archivos la cosa cambia.

Añadir includes innecesarios hace que el código tarde más en compilar y, claro, en proyectos pequeños no se nota... pero va siendo más palpable conforme añades archivos al proyecto.


Título: Re: Duda sobre memoria dinamica C++
Publicado por: erest0r en 11 Septiembre 2013, 09:34 am
Gracias de nuevo  :)