Estoy frustrado por una falla seg cuando cierro mi aplicación y el destructor se ejecuta para esta clase.

Vlocationdropdowns.h:

#include <QWidget>

class VLocationDropDowns : public QWidget
{
  Q_OBJECT
public:
  VLocationDropDowns(QString activeText, QWidget *parent = 0);
  ~VLocationDropDowns();
};

Vlocationdropdowns.cpp:

VLocationDropDowns::VLocationDropDowns(QString activeText, QWidget *parent) :
 QWidget()//I've also had this as QWidget(parent, Qt::Widget)
{
}

VLocationDropDowns::~VLocationDropDowns()
{
}

He creado un objeto de esta clase (locationLineEdit es un puntero) en el constructor de otra clase (tal vez debería decir que esta clase también hereda de QWidget):

locationDropDowns = new VLocationDropDowns(randomString, this);

Pero cuando el destructor de esa clase se ejecuta delete locationDropDowns; obtengo un segfault.

Soy nuevo en la gestión de la memoria, así que me doy cuenta de que esta es probablemente una pregunta de novato, pero ahora estoy jugando con ella. He comentado todo el contenido de las cosas que pude en vlocationdropdowns.cpp y todavía está fallando, así que no tengo idea ahora. ¿Qué podría estar causando esto?

0
jcuenod 9 ene. 2012 a las 02:19
¿Qué significa la macro Q_OBJECT?
 – 
Andrey Rubshtein
9 ene. 2012 a las 02:21
Es una macro de Qt. Creo que hace todas las cosas de señales y tragamonedas; para ser honesto, no estoy muy seguro, aunque sé que Qt lo necesita. No etiqueté este problema como Qt porque no creo que Qt tenga nada que ver con eso, podría estar equivocado.
 – 
jcuenod
9 ene. 2012 a las 02:22
Estás usando un new VLocationLineEdit, pero nos has mostrado un código de VLocationDropDowns. ¿No querías mostrarnos VLocationLineEdit?
 – 
Aaron McDaid
9 ene. 2012 a las 02:24
Ja, lo siento, arreglé eso, solo copié la línea de código incorrecta ...
 – 
jcuenod
9 ene. 2012 a las 02:24
¿Por qué no lo ejecuta a través del depurador?
 – 
LeleDumbo
9 ene. 2012 a las 02:25

1 respuesta

La mejor respuesta

Algunas sugerencias que probaría en este orden:

  • El código no se ve mal. Prueba una construcción limpia.
  • Ponga un printf en el destructor para ver si se está llamando.
  • Aislar a un pequeño programa que solo hace lo nuevo y lo elimina.
  • Pruébelo sin el Q_OBJECT
  • De la misma manera, intente crear y eliminar un QWidget por sí solo.
  • ¿Por qué no utiliza los parámetros pasados ​​al constructor?
3
ScrollerBlaster 9 ene. 2012 a las 02:27
Probé una construcción limpia, nada. Usé el depurador para ver que se estaba llamando al destructor, lo es. La razón por la que publiqué este código es que he comentado todo lo que puedo de esta clase (hasta este punto) y todavía tiene fallas seguras. Tengo otra clase (VLocationLineEdit) que se deconstruye bien. Pensé que tal vez estaba fallando debido a un problema de construcción de copia (por lo tanto, no se usan parámetros en el código publicado). Construiré un nuevo proyecto independiente y veré qué pasa.
 – 
jcuenod
9 ene. 2012 a las 02:35
2
¿Quizás esté siendo destruido dos veces? Ponga el printf en el destructor y no llame al delete explícitamente. Quizás algún otro código esté llamando al destructor primero. (En QT, si un widget está registrado con alguna ventana o algo así, ¿es responsable de eliminarlo?)
 – 
Aaron McDaid
9 ene. 2012 a las 02:36
@ j3frea, ¿intentaste con printfs / cout? ¿Qué sucedió? Ponga cout << "destructing" << endl; en el destructor y ponga cout << "deleted" << endl; inmediatamente después de la eliminación. Entonces cuéntanos qué pasa.
 – 
Aaron McDaid
9 ene. 2012 a las 02:37
De hecho, ya podría haber sido eliminado. Según los comentarios anteriores, podría estar en algo.
 – 
ScrollerBlaster
9 ene. 2012 a las 02:38
"destruyendo" "El programa ha finalizado inesperadamente."
 – 
jcuenod
9 ene. 2012 a las 02:40