私はC++でのポインタの深い理解が不足しているのに対して、 (私はROOTプロットパッケージを使用していますが、私はこれがちょうどだと思うデストラクタでポインタを削除するとクラッシュする
#include "Skymap.h"
Skymap::Skymap()
{
mCanvas.SetCanvasSize(1200,800);
mMarkerType=1;
}
Skymap::~Skymap()
{
delete mSkymapBorderBox;
}
void Skymap::DrawAitoffSkymap()
{
TBox* mSkymapBorderBox=new TBox(-200,-100,200,100);
//Use the mSkymapBorderBox pointer for a while
}
:として定義された関数で
class Skymap {
public:
Skymap();
~Skymap();
void DrawAitoffSkymap();
private:
TCanvas mCanvas;
TBox* mSkymapBorderBox;
};
:私は、次の定義が含まれSkymapと呼ばれるクラスを、書きました一般的なC + +の質問)。
さて、次のプログラムは、skymap2のデストラクタに到達するとクラッシュします:
int main(){
Skymap skymap1;
Skymap skymap2;
skymap1.DrawAitoffSkymap();
skymap2.DrawAitoffSkymap();
return(0);
}
ただし、以下はクラッシュしません:
またint main(){
Skymap skymap1;
skymap1.DrawAitoffSkymap();
return(0);
}
、私はNULLポインタのmSkymapBorderBoxを初期化する場合コンストラクタで、私はもはや最初のプログラム(2つのSkymapオブジェクトを持つ)の実行に続くクラッシュを経験しません。
誰でもこの根本的な原因を説明できますか? 2番目のSkymapオブジェクトのポインタに問題があるように見えますが、私はそれが何であるかわかりません。
それは、この問題の原因ではないのですが、常に[三の規則]を覚えている(http://stackoverflow.com/questions/4172722)リソースを管理しているときそしてもっと良いことに、自分でリソースを管理しないでください。[スマートポインタ](http://stackoverflow.com/questions/8839943)、コンテナ、その他のRAIIクラスを使用してください。 –
これは、コンストラクタでその時点で割り当てられていない場合は常にポインタをNULLに設定する必要があります。 – crashmstr