C ++尝试删除不存在的指针

时间:2014-02-27 01:31:47

标签: c++ pointers

我正在使用一个基于文本的小游戏,如果用户通过以下代码行选择了该选项,我的功能基本上会结束游戏:

void MainMenu::Exit()
{
    std::exit(0);
}

这很好,但是调用MainMenu析构函数,它包含对使用new关键字创建的指针的删除调用(因此我认为我需要在退出程序之前手动删除对象)。该对象是我的世界级,在用户选择播放时创建。但是,用户可以在创建世界指针之前退出主菜单,因此编译器不知道指针指向的位置。我尝试更改析构函数以查看world对象是否为NULL,如下所示:

MainMenu::~MainMenu()
{
    if(world != NULL)
         delete world;
}  

但我仍然会弹出一个窗口,告诉我程序已经停止响应,我需要手动终止它。

基本上我的问题是,有没有办法判断一个指针是否实际指向某个东西?我甚至需要手动处理删除指针吗?

2 个答案:

答案 0 :(得分:0)

是的,在C ++中,您必须确保每个'new'都与'delete'匹配。你应该在MainMenu ctor中确保你正在将world初始化为NULL(或者如果你的编译器支持它,最好是nullptr):

MainMenu::MainMenu (/* more stuff here */) : world (nullptr)
{
// more stuff here
}

此外,正如克里斯指出的那样,删除时不必测试NULL:

MainMenu::~MainMenu()
{
delete world; // no-op if world is null
} 

不知道为什么你的程序挂起了。如果你没有将'world'初始化为null,那么它似乎应该是错误的。

答案 1 :(得分:0)

您必须在类的构造函数中初始化指针。可以在不检查指针是否等于NULL的情况下编写析构函数。

MainMenu::~MainMenu()
{
         delete world;
} 

使用标准智能指针(例如std::unique_ptr

)也好得多