Я столкнулся с недостатком глубокого понимания указателей на 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 в конструкторе я больше не испытываю сбой после выполнения первой программы (с двумя объектами Skymap).
Может ли кто-нибудь объяснить причину этого? Это проблема с указателем во втором объекте Skymap, но я не вижу, что это такое.
Это не является причиной этой проблемы, но всегда помнить [Правило трех] (http://stackoverflow.com/questions/4172722) когда вы управляете ресурсами. И еще лучше, не управляйте ресурсами самостоятельно - используйте [умные указатели] (http://stackoverflow.com/questions/8839943), контейнеры и другие классы RAII. –
Ну, вы * должны * всегда устанавливать указатели на 'NULL', если не выделять в это время в конструкторе. – crashmstr