new
-
delete
Los operadores de los
malloc()
y
free()
las funciones de diferencia
new
-
delete
Los operadores de los
malloc()
y
free()
las funciones de diferencia
1. new
- delete
Operador y malloc()
- free()
la función de la diferencia
new
Ydelete
los operadores de sustituciónmalloc()
yfree()
funciones.new
Puede realmente crear un objeto, lamalloc()
función simplemente asigna memoria.new
Ydelete
los operadores con más conveniente (automatizasizeof
el trabajo computacional, y llama automáticamente al constructor y el destructor sea apropiado).new
El operador puede asignar espacio para una nueva variable en un tipo particular de memoria libre. Alias montón de memoria libre.malloc()
funciones de asignación de memoria dinámica desde el montón.new
-delete
es una palabra clave en C ++, se requiere el apoyo del compilador.malloc()
-free()
es una función de biblioteca en el archivo de cabecerastdlib.h
de declaración.new
Cuando la asignación de memoria falla, el valor por defecto produce una terminación anormal del programa, que no volveráNULL
. Si el sistema operativo no es capaz demalloc()
proporcionar más memoria,malloc()
se devuelve unNULL
puntero. Para cada esclavomalloc()
vuelve puntero se comprueban para asegurarse de que no esNULL
muy importante.free()
El argumento debe serNULL
, ya sea desde una anteriormalloc()
,calloc()
orealloc()
el valor devuelto. Parafree()
pasar unNULL
parámetro no tiene efecto.malloc()
Un tipo de retornovoid *
del puntero. Representa un estándarvoid *
tipo de puntero se puede convertir en cualquier otro tipo de puntero.- requisitos de alineación de frontera para la máquina,
malloc()
devueltos a la memoria la posición inicial siempre va a ser capaz de cumplir los más exigentes de las reivindicaciones tipo de alineación de contorno.
1.1 new
operador
new
Operador liberar memoria asignada dinámicamente memoria. Después asignado con éxito la memoria a petición, el operador devuelve un puntero que apunta a un área de memoria proporcionada por la cabeza, si no puede asignar la memoria, por lo que un defecto lanza de terminación anormal del programa.
1.2 delete
operador
Usando el delete
operador puede liberar el lado frontal con una new
memoria del operador de asignación.
2. La asignación de memoria dinámica
Durante la ejecución, a menudo se necesita para los datos de entrada del programa, para determinar la cantidad de espacio de almacenamiento se debe dar diferentes tipos de variables asignadas. Cualquier programa que involucra el procesamiento de elementos de datos no conocidos de antemano, se puede utilizar esta función asigna memoria para almacenar los datos en tiempo de ejecución.
Debido a que es imposible definir las variables asignados dinámicamente en tiempo de compilación, por lo que no voy a nombrar la fuente. Al crear estas variables, la memoria de la computadora con la dirección correspondiente a identificarlos, la dirección almacenada en el puntero. Por medio de punteros de energía y Visual C++
herramienta de gestión de memoria dinámica que puede rápida y fácilmente hacer que los programas escritos con esta flexibilidad.
2.1 montón de alias - memoria libre
En la mayoría de los casos, cuando se ejecuta el programa, el equipo tiene una sección no utilizada de la memoria. Estos memoria llamada pila, también se refirió a la memoria libre veces. El uso de un operador especial puede asignar espacio para una nueva variable en un tipo particular de memoria libre. El operador devuelve la dirección de memoria asignada a la variable, es el new
operador, se empareja con delete
el operador, el efecto es la liberación de los anteriormente new
memoria asignada.
Pueden ser asignados a ciertas variables en el programa en el espacio de memoria libre, estas variables cuando ya no sea necesario, el espacio asignado y luego liberados y devueltos a la memoria libre. De esta manera, esta memoria puede ser reutilizado por otras variables dinámicamente asignados. Esta técnica es muy potente y puede ser un uso muy eficiente de la memoria.
puntero inteligente es un puntero a las alternativas. La asignación dinámica de la memoria, especialmente cuando el objeto a una matriz o una asignación dinámica más compleja de la memoria, preferiblemente usando punteros inteligentes. Cuando ya no se necesita puntero inteligente, se dará a conocer de forma automática la memoria, de modo que ya no hay necesidad de preocuparse por la liberación de memoria.
2.2 new
y delete
operador
Supongamos que un double
se necesita espacio variable. Podemos definir un puntero double
tipo puntero y ejecute de nuevo cuando una solicitud para asignar memoria. Esta tarea se puede utilizar en la declaración siguiente new
para completar el operador:
double *pvalue {};
pvalue = new double; // Request memory for a double variable
Todos los indicadores deben ser inicializados. El uso de memoria dinámica por lo general implican un gran número de puntero de libre flotación, lo que garantiza que no contienen falsa valor es muy importante. Si el puntero no contiene un valor de dirección válida, debe ponerlo a nullptr
.
La segunda línea de frente new
el operador regresa a la memoria de inactividad que se asignará a double
la dirección de memoria de una variable, un puntero y pvalue
almacena la dirección. A partir de entonces, usando el operador de indirección aprendido anterior, un puntero puede pvalue
hacer referencia a double
las variables.
*pva1ue = 9999.0;
Nuestro sistema puede no asigna solicitud de memoria, puede ser debido a la memoria libre en la memoria ya agotado, la parte delantera o la memoria libre debido a la utilización roto - que no es lo suficientemente bytes contiguos tienen por qué ser proporcionados al espacio variable. Sin embargo, no tenemos que preocuparnos demasiado por eso. Si el sistema no puede asignar la memoria, entonces el new
operador tendrá una excepción, por lo que la rutina se termina.
new
Las variables también pueden ser creados para inicializar. Utilizando la anterior new
asignación de double
las variables, por ejemplo, cuya dirección está almacenada en pvalue
, puede utilizar la siguiente declaración al mismo tiempo crear la variable se inicializa a 999.0
:
pvalue = new double {999.0}; // Allocate a double and initialize it
Por supuesto, sólo se puede crear este puntero con una declaración e inicializado:
double *pvalue {new double{999.0}};
Cuando una variable ya no es necesario asignar dinámicamente, puede ser delete
operador para liberar la memoria ocupada por éste a la memoria libre:
delete pvalue; // Release memory pointed to by pvalue
Otra variable que puede ser utilizado de esta manera se asegurará de que la memoria más adelante. Si no se utiliza delete
, y más tarde en pvalue
puntero del depósito a un valor de dirección diferente, usted no será capaz de liberar esta memoria, o las variables de uso que contiene, porque hemos perdido la manera de acceder a la dirección. Esta condición se conoce como pérdidas de memoria - en especial aparece en el programa de usuario en el tiempo.
Tras la liberación puntero a la memoria, debe establecer el valor del puntero es nullptr
, de lo contrario, la suspensión del puntero aparecerá, que puede pasar este puntero a la memoria de acceso liberado.
2.3 es una matriz asignada dinámicamente
Una matriz de asignación de memoria dinámica es muy simple. Dar el char
tipo de asignación de gama de espacio, puede escribir la siguiente declaración:
char *pstr {new char[20]}; // Allocate a string of twenty characters
La declaración es de 20 caracteres en la char
matriz de espacio asignado, y la dirección se almacena pstr
en. Para eliminar una matriz acaba de crear, debe utilizar el delete
operador. La declaración correspondiente es el siguiente:
delete [] pstr; // De1ete array pointed to by pstr
Utilice corchetes para indicar que desea borrar una matriz. Cuando se elimina una matriz desde la memoria libre, debe incluir siempre los corchetes, de lo contrario los resultados serán impredecibles. También tenga en cuenta que, sin especificar cualquier número de dimensiones, sólo tienen que escribir []
a.
Por supuesto, el puntero pstr
de memoria ahora contiene la dirección puede haber sido asignado a otros usos de las variables, por supuesto, no debe ser utilizado y, por tanto, este puntero. Cuando delete
después de una asignación de memoria antes de que el operador de abandonar mayor debe ser siempre restablece a este punteronullptr
:
pstr = nullptr;
se han suprimido este modo se garantiza que no vamos a tratar de memoria de acceso. Ya no apuntan a puntero de área de memoria válida se pone a nullptr
.
Puede inicializar un espacio de memoria asignado en una variedad de reposo:
int *data {new int[10] {2,3,4}};
long *pprime {new long[4] {3L,6L,9L}};
La primera sentencia crea una matriz de enteros que contienen 10 elementos, y los tres primeros elementos 2, 3 y 4 se inicializa. Los elementos restantes se inicializan a cero.
La segunda instrucción crea una matriz de entero largo consta de cuatro elementos, y los tres primeros elementos inicializados a 3L, 6L y 9L. Los elementos restantes se inicializan a cero.
2.4 matrices multidimensionales asignados dinámicamente
En comparación con la matriz unidimensional, como matriz multi-dimensional asigna RAM de memoria libre se utiliza para formar un poco más compleja new
operadores.
Supongamos puntero ya declaradas pbeans
:
double (*pbeans)[4] {};
Con el fin de hacer al principio de este capítulo se han utilizado matrices beans[3][4]
para obtener el espacio, puede utilizar la siguiente declaración:
pbeans = new double [3][4] // Allocate memory for a 3x4 array
Sólo es necesario especificar una dimensión de matriz entre corchetes después del nombre de la matriz de tipo de elemento. Por supuesto, también puede ser un paso:
double (*pbeans)[4] {new double [3][4]};
Como se muestra abajo, con el new
operador para asignar una matriz de espacio tridimensional sólo tiene que especificar la tercera dimensión:
auto pBigArray (new double [5][10][10]); // Allocate memory for a 5x10x10 array
Esta instrucción utiliza auto
inferir automáticamente los tipos de puntero. No se olvide, y no puede ser usado en conjunción con la lista de inicialización auto
. Se puede escribir la siguiente declaración:
auto pBigArray = new double[5][10][10]; // Allocate memory for a 5x10x10 array
No importa cuántas dimensiones se crea la matriz, puede utilizar la siguiente matriz comunicado destruido y lanzado en la memoria de inactividad de memoria:
de1ete [] pBigArray; // Release memory for array
pBigArray = nullptr;
Siempre sólo necesita delete
para mantenerse al día con un par de corchetes en la parte posterior del operador, independientemente de la dimensión de matriz asociativa es.
Que se puede utilizar para especificar la mayoría de las variables new
asignadas unidimensionales dimensiones de la matriz. Bidimensional o matriz multidimensional Lo mismo es cierto, pero sólo en la dimensión más a la izquierda designada con esa variable. Todas las demás dimensiones deben ser una constante o una expresión constante. Por lo tanto se puede escribir:
pBigArray = new double[max][10][10];
¿Qué max
es una variable. No es la dimensión más a la izquierda especifica variable, el compilador generará un mensaje de error.