gpt4 book ai didi

c++ - 在析构函数中删除指针时崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:53 25 4
gpt4 key购买 nike

我遇到了对 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 对象中的指针有问题,但我看不出是什么问题。

最佳答案

TBox* mSkymapBorderBox=new TBox(-200,-100,200,100);

在这里,您将内存分配给局部变量,而不是成员变量。并且由于您没有为成员变量分配内存,因此对其调用 delete 会调用未定义的行为,这会导致您的情况崩溃。

你应该做的是:

mSkymapBorderBox=new TBox(-200,-100,200,100);

现在为成员变量分配内存。这是局部变量的命名应与成员变量不同的原因之一。命名约定有助于避免此类错误。

作为旁注,或者更确切地说是非常重要的说明,由于您的类管理资源,请考虑正确实现复制语义和析构函数:此规则通常称为 the-rule-of-three .或者使用一些智能指针,例如std::shared_ptrstd::unique_ptr 或任何适合您场景的指针。

关于c++ - 在析构函数中删除指针时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9400839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com