He estado experimentando segfaults cuando se ejecuta código C++. He aislado el problema a una línea en el programa que elimina a un puntero. He aquí un ejemplo simple que produce el mismo error:

int main()
{
  int* pointer=0;
  int number = 3;

  pointer = &number;
  delete pointer;//This line causes a segmentation fault
  pointer=0;

  return 0;
}

Una ligera modificación produce un código que funcionará como se esperaba:

int main()
{
  int* pointer=new int(3);

  delete pointer;//This line now works
  pointer=0;

  return 0;
}

Puede alguien explicar por qué la primera causa de una violación de segmento y el segundo no? Sé que el puntero no válido, ya que ha sido asignado a la dirección de la variable de número.

  • La primera no fue asignado con new por lo que llamar a delete en ella nunca es la cosa correcta de hacer.
InformationsquelleAutor rnorris | 2012-02-10

5 Comentarios

  1. 18

    Usted sólo debe siempre delete de memoria que ha sido asignado con new. Automática de las variables declaradas en la pila no necesitan ser deleted. Como regla general, siempre que coincida con su memoria de asignación y desasignación tipos:

    • Memoria asignada con new debe ser desasignado con delete.
    • Memoria asignada con new [] debe ser desasignado con delete [].
    • Memoria asignada con malloc() debe ser desasignado con free().

    La violación de segmento es porque el delete operador intentará poner que la memoria de nuevo en el montón, y que depende de ciertas propiedades de la memoria que no es cierto para la automática de la memoria en la pila que no se originan en el montón.

  2. 4

    No puede usar delete en cualquier cosa que no se consigue con new. Intentar hacerlo provocará un comportamiento indefinido. El programa se estrelló, pero nada podría haber ocurrido.

  3. 2

    Llamar a eliminar en un puntero, cancela la asignación de la memoria asignada dinámicamente que señala el puntero.

    En el primer programa, el puntero apunta a una memoria asignada estáticamente ubicación.La variable número es un ‘automático’ variable, lo que significa que su memoria se gestionan automáticamente.

    Por otro lado, en el segundo programa, el puntero que apunta a una ubicación de memoria asignada en el montón segmento, que tiene que ser manualmente desasignado llamando a eliminar.

    Usted puede encontrar este enlace útil.

  4. 0

    Cuando delete un puntero que no estaba asignado con new, está creando un conflicto entre el sistema de gestión de memoria y la pila. Cada uno se va a operar como si todavía tiene la titularidad exclusiva de la memoria, y una caída puede resultar cuando se superponen los valores.

  5. 0

    Cuando se trata de asignar un variabile con nuevo:

    int *a=new int(4);

    Esta variable se pone en el montón, que contiene toda la memoria dnamicly asignado.
    Si en lugar de declarar una variable:

    int a=4;

    una se asigna en la pila, donde no hay memoria estática.
    Dinámica de memoria puede ser desasignado con eliminar del usuario, pero la memoria estática no se puede.
    La memoria estática es automaticlly removidos cuando usted salga de froma función:

    void function()
    {
        int a;
    }

    Cuando la función termina automáticamente se cancela la asignación (excepto para las variables declaradas con la palabra clave «estática»).
    También las variables en la función principal, automáticamente se cancela la asignación.
    Así que no se puede decir que el programa para desasignar una variable en la pila.
    En tu ejemplo, el número que está en la pila puntero que señala el número que está en la pila, si usted lo elimine usted está tratando de eliminar una variable en la pila, lo cual no está permitido,porque no es la memoria dinámica.

Dejar respuesta

Please enter your comment!
Please enter your name here