C ++: 59 --- asignación de memoria de control de herramientas y técnicas especiales (sobrecarga de nuevo y de borrado, la colocación nueva expresión)

  • Algunas aplicaciones tienen necesidades especiales de asignación de memoria, por lo que no se pueden aplicar directamente a los mecanismos de gestión de memoria estándar para estos programas. A menudo necesitan para definir los detalles de la asignación de memoria, tales como el uso de la nueva palabra clave al objeto colocado en un espacio de memoria en particular. Para lograr esto, la aplicación debe sobrecargar operadores new y delete operador controlar el proceso de asignación de memoria

En primer lugar, la sobrecarga de nuevo y borrar

Obras de nuevo y borrar

  • La sobrecarga de nuevo y eliminar de operador ordinaria sobrecargar a ser más trabajo en el primer vistazo sobrecargado antes en las obras de nuevo y borrar
  • Nuevas obras se dividen generalmente en tres pasos:
    • El primer paso: nueva nueva expresión llama a una función de la biblioteca estándar nombrado nuevo operador (o el operador new []) es. Esta función asigna una suficientemente grande, el original, el espacio de memoria identificado para el almacenamiento de objetos de un tipo específico (o un conjunto de objetos)
    • Segundo paso: Compiler ejecutar el constructor apropiado para construir el objeto, y que pasa a un valor inicial para
    • El tercer paso: los objetos se asignan espacio y configurados para completa, devuelve un puntero al objeto
std::string *sp = new std::string("a value"); //分配并初始化一个string对象
std::string *arr = new std::string[10];       //分配10个默认初始化的string对象
  • Las obras de eliminación se divide generalmente en dos pasos:
    • Paso: un array referentes ejecutadas o se hace referencia a los elementos correspondientes destructor
    • Paso dos: la llamada llamado operador de eliminación (o operador delete []) la función de la biblioteca estándar de espacio de memoria libre
delete sp;    //销毁sp,释放sp所指的内存空间
delete[] arr; //销毁数组中的所有元素,然后释放对应的内存空间

Después de llamar a la secuencia de la sobrecarga de nuevo y borrar

  • Las aplicaciones pueden definir el alcance mundial de operadores de función y operadores nuevas funciones de borrado, sino que también se pueden definir como una función miembro

  • Si se asigna el objeto (liberado) es un tipo de clase, entonces el orden de búsqueda compilador para llamar nueva (o eliminar) de la siguiente manera:
    • Ir alcance global para encontrar un reemplazo liberación de una aplicación nueva (o eliminar), en su caso, en el uso de
    • Si no anula el ámbito global, y luego ir a clase para averiguar si hay están sobrecargados nueva (o eliminar) la función miembro, en su caso, en el uso de
    • Si no hay una versión de los miembros de función, entonces la final antes de ir a usar la nueva (o eliminar) la biblioteca estándar
  • También puede utilizar el operador de alcance para hacer nuevos (o eliminar) en función de la definición de clase se ignora, y la versión utilizada directamente en el ámbito global. Por ejemplo:
::new     //查找全局作用域中的new
::delete  //查找全局作用域中的delete

interfaz de biblioteca estándar

  • La biblioteca define operador nueva función y funciones de operador de borrado 8 Ejecución sólida y robusta . donde:
    • Las cuatro primeras versiones pueden lanzar una excepción
    • Después de cuatro ediciones se lanza ninguna excepción

  • nothrow_t estructura: definir una estructura en el nuevo archivo de cabecera, ningún miembro de este tipo
  • nothrow objetos: la definición de un objeto constante en el nuevo archivo de cabecera, el usuario puede solicitar un nuevo objeto de esta versión no tirado (se puede ver este artículo en el "manejo de excepciones bad_alloc": https://blog.csdn.net/ qq_41453285 / Article / Detalles / 95603693 )

Sobrecargados nuevos y eliminar los miembros son de la versión estática

  • Podemos estar sobrecargado nuevo y borrar versión global o la versión de los miembros de la clase. Si los miembros del grupo están sobrecargados versión, a continuación, los miembros de la nueva versión y eliminar la estática por defecto (para los que no nos declaramos estática)
  • Motivo:
    • Debido a que el nuevo uso antes de que el constructor de objetos, eliminar utiliza después el objeto se destruye, por lo que los dos miembros deben ser estáticas
    • Y que pueden manipular ningún miembro de datos de la clase

La sobrecarga de nuevo

  • Para el operador de la biblioteca estándar nuevo y nuevo operador [] es:

    • El tipo de valor de retorno debe ser void *

    • El primer tipo de parámetro debe ser size_t, y este parámetro no puede contener argumento predeterminado

  • Si nuestra operadora personalizada nueva y operador new []:

    • Podemos proporcionar parámetro adicional para ellos . En este momento, estas funciones personalizadas utilizadas en la nueva expresión deben ser posicionados en forma de nuevo (ver descripción más abajo), el argumento se pasa al nuevo parámetro

  • Nótese, sin embargo, después de esta función, el usuario puede no estar sobrecargado (Esta forma es para el uso de la biblioteca estándar, no puede ser sobrecargado usuario):

void *operator new(size_t, void*);  //不允许重载这个版本

sobrecargado eliminar

  • Para borrar el operador y el operador de la biblioteca estándar delete [] para:

    • El tipo de valor de retorno debe ser nula

    • El primer tipo de parámetro debe ser void *. Realización de un operador de la expresión de borrado llama a la función apropiada, y para ser puesto en libertad por el puntero de memoria a punto para la inicialización de parámetros void *

  • Si nuestra operadora personalizada borrar y operador delete []:

    • Y el destructor Del mismo modo, el operador de eliminación no tirar o. Así que cuando sobrecargamos estos operadores, debe utilizar especificador excepción noexcept para especificar que no lanza una excepción

    • Cuando eliminar o Eliminar [] cuando define como un miembro de la clase , la función puede comprender además un parámetro de tipo size_t:

      • En este caso, el valor inicial del parámetro es el número de bytes en el primer referente parámetro

      • parámetro size_t se puede utilizar para eliminar la jerarquía de objetos de herencia. Si hay un destructor clase base virtual, entonces el número de bytes pasa a eliminar variará dependiendo del tipo dinámico de un objeto a ser eliminada se denomina puntero difieren. Por otra parte, el funcionamiento real de la versión función de borrado también está determinada por el tipo dinámico del objeto

la función malloc, función libre

  • A pesar de que el operador sobrecargado función de borrado nuevo y operador, pero la función eventualmente la necesidad de asignar y liberar memoria, y luego, cuando el uso de asignar y liberar memoria, puede llamar a las funciones malloc y gratuitas en la biblioteca C
  • funciones malloc y gratuitas ver: https://blog.csdn.net/qq_41453285/article/details/88880389
  • La siguiente es una forma simple de operador de sobrecarga de nuevo y operador de eliminación, por ejemplo:
void *operator new(std::size_t size)
{
    if (void *mem = malloc(size))
        return mem;
    else
        throw std::bad_alloc();
}

void operator delete(void *mem)noexcept
{
    free(mem);
}

En segundo lugar, el posicionamiento de nueva expresión (colocación nuevo)

  • Nuevo posicionamiento en otro artículo también se introduce por separado, se puede ver: https://blog.csdn.net/qq_41453285/article/details/103547699
  • operador nuevo y operador de eliminación se puede utilizar para asignar y liberar espacio, pero no construye o destruir objetos (nuestra propia necesidad de escribir en una función) . Sin embargo, podemos utilizar la nueva forma nuevo posicionamiento (colocación nuevo) del objeto se construye
  • Posicionado para la nueva función de distribución para proporcionar información adicional, podemos usar el nuevo posicionamiento de una dirección de transferencia, cuando el posicionamiento de la nueva forma es el siguiente:
    • place_address: es un puntero
    • inicializadores: una lista (posiblemente vacía) de los valores iniciales de una lista separada por comas de valores iniciales para la construcción de nuevos objetos asignados

  • Cuando el valor de la dirección por una sola llamada, utilizando el nuevo operador de posicionamiento nueva (size_t, void *) asignar memoria . Esta no es una de nuestra operadora personalizada nueva versión. Esta función no se asigna ninguna memoria, simplemente devuelve un puntero al argumento; entonces responsable de la dirección especificada en el nuevo objeto de expresión se inicializa para completar el trabajo. De hecho, el nuevo posicionamiento nos permite una preasignados dirección determinada, la memoria de un buen constructor

  • El posicionamiento es similar a la construcción de nuevos miembros asignador de clase, pero con una diferencia importante:
    • Pasamos el puntero debe apuntar a la construcción de un objeto espacial se asigna el mismo asignador
    • Pero pasó sin colocación de nuevos puntero apunta al operador de la memoria nueva asignación. De hecho, la nueva expresión pasada posicionamiento puntero no necesita ni siquiera a punto de memoria dinámica

destructor llamada explícita

  • posicionamiento similar y asignar nueva clase, se utiliza una llamada explícita al destructor también como destruir
  • Nosotros ya sea a través de un destructor objeto se llama, también puede ser a través de un puntero o una referencia a un objeto destructor se llama, y llamar a la función de miembro algo como:
std::string *sp = new std::string("a value");
sp->~string(); //调用析构函数销毁对象,但是sp所指的内存没有释放
  • Y destruir las llamadas similares, llamando al destructor para destruir el objeto, pero no va a liberar espacio en la memoria . Por lo tanto, se puede utilizar en varias ocasiones este espacio de memoria . Por ejemplo:
std::string *sp = new std::string("a value");
sp->~string(); //调用析构函数销毁对象,但是sp所指的内存没有释放

std::string *sp=new std::string("new value"); //重新使用sp所指的内存空间进行对象的构造

Liberadas 1504 artículos originales · ganado elogios 1063 · Vistas de 430.000 +

Supongo que te gusta

Origin blog.csdn.net/qq_41453285/article/details/104690501
Recomendado
Clasificación