La diferencia entre el libre () Función - nuevo - operador de eliminación y malloc ()

new - delete Los operadores de los malloc() y free() las funciones de diferencia

1. new- deleteOperador y malloc()- free()la función de la diferencia

  1. newY deletelos operadores de sustitución malloc()y free()funciones.
  2. newPuede realmente crear un objeto, la malloc()función simplemente asigna memoria.
  3. newY deletelos operadores con más conveniente (automatiza sizeofel trabajo computacional, y llama automáticamente al constructor y el destructor sea apropiado).
  4. newEl 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.
  5. new- deletees una palabra clave en C ++, se requiere el apoyo del compilador. malloc()- free()es una función de biblioteca en el archivo de cabecera stdlib.hde declaración.
  6. newCuando 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 de malloc()proporcionar más memoria, malloc()se devuelve un NULLpuntero. Para cada esclavo malloc()vuelve puntero se comprueban para asegurarse de que no es NULLmuy importante.
  7. free()El argumento debe ser NULL, ya sea desde una anterior malloc(), calloc()o realloc()el valor devuelto. Para free()pasar un NULLparámetro no tiene efecto.
  8. malloc()Un tipo de retorno void *del puntero. Representa un estándar void *tipo de puntero se puede convertir en cualquier otro tipo de puntero.
  9. 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 newoperador

newOperador 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 deleteoperador

Usando el deleteoperador puede liberar el lado frontal con una newmemoria 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 newoperador, se empareja con deleteel operador, el efecto es la liberación de los anteriormente newmemoria 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 newy deleteoperador

Supongamos que un doublese necesita espacio variable. Podemos definir un puntero doubletipo puntero y ejecute de nuevo cuando una solicitud para asignar memoria. Esta tarea se puede utilizar en la declaración siguiente newpara 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 newel operador regresa a la memoria de inactividad que se asignará a doublela dirección de memoria de una variable, un puntero y pvaluealmacena la dirección. A partir de entonces, usando el operador de indirección aprendido anterior, un puntero puede pvaluehacer referencia a doublelas 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 newoperador tendrá una excepción, por lo que la rutina se termina.

newLas variables también pueden ser creados para inicializar. Utilizando la anterior newasignación de doublelas 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 deleteoperador 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 pvaluepuntero 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 chartipo 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 charmatriz de espacio asignado, y la dirección se almacena pstren. Para eliminar una matriz acaba de crear, debe utilizar el deleteoperador. 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 pstrde 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 deletedespué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 newoperadores.

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 newoperador 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 autoinferir 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 deletepara 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 newasignadas 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é maxes una variable. No es la dimensión más a la izquierda especifica variable, el compilador generará un mensaje de error.

Publicados 525 artículos originales · ganado elogios 1876 · Vistas 1,16 millones +

Supongo que te gusta

Origin blog.csdn.net/chengyq116/article/details/105209316
Recomendado
Clasificación