由于在C

时间:2017-12-01 22:39:38

标签: c pointers null

作为我目前参加的课程的一部分,我们正在C语言中使用自行开发的低级库,我们现在正在进行最终项目,这是一个游戏。

在某个时刻,似乎有一个结构(作为一种对象),它拥有关于当前游戏状态的一些重要信息,即指向玩家“对象”的指针(无法真正调用我们使用实际对象的模拟对象,我们可以吗?)。

它会是这样的:

typedef struct {
    //Holds relevant information about game current state
    state_st currstate;
    //Buffer of events to process ('array of events')
    //Needs to be pointers because of deallocating memory
    event_st ** event_buffer;
    //Indicates the size of the event buffer array above
    unsigned int n_events_to_process;
    //... Other members ...
    //Pointer to a player (Pointer to allow allocation and deallocation)
    Player * player;
    //Flag that indicates if a player has been created
    bool player_created;
} Game_Info;

问题如下:

如果我们要坚持本课程大部分时间使用的设计理念,我们将使用Game_Info * create_game_info()destroy_game_info(Game_Info * gi_ptr)之类的函数“抽象”这些“对象”,以充当构造函数和这些“对象”的析构函数(同样,“成员函数”类似update_game_state(Game_Info * gi_ptr),像C ++一样通过传递通常隐式的this作为第一个参数。)

因此,作为一种检测Game_Info“实例”中的玩家对象是否已被删除的方法,我将玩家指针与NULL进行比较,因为在所有“析构函数”中,在释放内存后我设置了传递指向NULL的指针,表示该对象已成功解除分配。

这显然会导致一个问题(我最初没有检测到,因此在我仍然掌握正在发生的事情的同时修复了它的player_created bool标志),因为指针是通过副本传递而不是通过引用,在调用“object”“析构函数”之后它不会设置为NULL,因此将它与NULL进行比较并不是一种可靠的方法来知道指针是否已被释放。

我正在写这篇文章,然后请求输入解决这个问题的最佳方法:

  • 一个标志,用于指示“对象”是否“实例化” - 在比较中使用标志而不是ptr == NULL断言“对象”是否为“实例” - 我目前正在使用的解决方案< / LI>
  • 将指针传递给指针(使用&player而不是player调用函数) - 将启用设置为NULL
  • 在调用“析构函数”
  • 之后,将指针设置为上面的一个“级别”
  • 任何其他解决方案,因为我在C方面不是很有经验,而且可能忽略了解决此问题的更简单方法。

感谢您阅读以及您可能提供的任何建议!

1 个答案:

答案 0 :(得分:0)

  

那么,我正在写这篇文章,以寻求有关克服该问题的最佳方法的信息:

什么将是最好的方法主要是基于意见的,但是列出的最糟糕的方法是第一种,其中必须使两个变量(指针和标志)保持同步。 >

  

任何其他解决方案...

另一种解决方案是使用宏,例如。 g。:

#define destroy_player(p) do { /* whatever cleanup needed */; free(p), p = NULL; } while (0)
…
    destroy_player(gi_ptr->player);