【发布时间】:2012-03-13 03:18:07
【问题描述】:
我遇到了我对 C++ 中指针缺乏深入理解的问题。我编写了一个名为 Skymap 的类,其定义如下:
class Skymap {
public:
Skymap();
~Skymap();
void DrawAitoffSkymap();
private:
TCanvas mCanvas;
TBox* mSkymapBorderBox;
};
函数定义为:
#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
}
(我使用的是ROOT绘图包,但我认为这只是一个一般的C++问题)。
现在,以下程序将在到达 skymap2 的析构函数时崩溃:
int main(){
Skymap skymap1;
Skymap skymap2;
skymap1.DrawAitoffSkymap();
skymap2.DrawAitoffSkymap();
return(0);
}
但是,以下内容不会崩溃:
int main(){
Skymap skymap1;
skymap1.DrawAitoffSkymap();
return(0);
}
此外,如果我在构造函数中将指针 mSkymapBorderBox 初始化为 NULL,则在执行第一个程序(带有 2 个 Skymap 对象)后我不再遇到崩溃。
谁能解释一下造成这种情况的根本原因是什么?第二个 Skymap 对象中的指针似乎有问题,但我看不到它是什么。
【问题讨论】:
-
这不是导致此问题的原因,但在管理资源时请始终记住Rule of Three。更好的是,不要自己管理资源 - 使用 smart pointers、容器和其他 RAII 类。
-
好吧,如果当时没有在构造函数中分配,你应该总是将指针设置为
NULL。
标签: c++ pointers destructor