2012-01-08 10 views
0

私はアプリケーションを閉じて、このクラスのデストラクタを実行すると、segフォールトに悩まされています。Segfault onデストラクタ

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() 
{ 
} 

私は多分私がすべき(別のクラスのコンストラクタで(locationLineEditがポインタである)、このクラスのオブジェクトを作成しましたこのクラスはQWidgetから継承していると言う):

locationDropDowns = new VLocationDropDowns(randomString, this); 

しかし、彼はそのクラスのデストラクタを実行しますdelete locationDropDowns;私はsegfaultを取得します。

私はこれがおそらくノブの質問であることを認識しているので、私はメモリを管理するのが初めてです。私は vlocationdropdowns.cppでできることのすべての内容をコメントアウトしました。これを引き起こす原因は何ですか?私はこのためにしようとするだろう

+0

マクロQ_OBJECTとは何ですか? –

+0

Qtマクロです。私はそれがすべての信号とスロットのものを行うと思う - 正直言って私はあまりよく分からない、私はQtがそれを必要と知っている。私はこの問題をQtとしてタグ付けしていませんでした。なぜならQtはそれと関係がないと思うからです。私は間違っている可能性があります。 – jcuenod

+0

あなたは '新しいVLocationLineEdit'を使っていますが、' VLocationDropDowns'のコードをいくつか見せてくれました。私たちに 'VLocationLineEdit'を見せてもらえませんでしたか? –

答えて

2

ヒント:

  • コードが間違って見ていません。クリーンなビルドを試してください。
  • デストラクタにprintfを入れて呼び出されていることを確認します。
  • 新しく作成して削除する小さなプログラムに分かれて削除します。
  • Q_OBJECT
  • 同様に、代わりにQWidgetを作成して削除してみてください。
  • コンストラクタに渡されるパラメータを使用していないのはなぜですか?
+0

私はきれいなビルドを試みました - 何もありません。デストラクタが呼ばれていたのを見るためにデバッガを使用しました。私がこのコードを投稿した理由は、私がこのクラスのできるだけコメントアウトしていて(これまでのところ)、それでもフォールトしているということです。私は別のクラス(VLocationLineEdit)を持っています。私はコピー構築の問題のためにsegfaultingかもしれないと考えました(したがって、投稿されたコードのパラメータは使用されません)。私は新しい独立したプロジェクトを作り、何が起こるかを見ます。 – jcuenod

+2

恐らく2度破壊されているのでしょうか? printfをデストラクタに入れ、明示的に 'delete'を呼び出しません。たぶん、他のコードがデストラクタを最初に呼び出すことがあります。 (QTでは、ウィジェットがいくつかのウィンドウなどに登録されている場合は、それを削除する責任はありますか?) –

+0

@ j3frea、printfs/coutを試しましたか?何が起こった?デストラクタに '' cout << "" destructing "<< endl;を入れ、削除の直後に' 'cout <<" "<<" endl;を置きます。その後、何が起こるか教えてください。 –