作为我目前参加的课程的一部分,我们正在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 感谢您阅读以及您可能提供的任何建议!
答案 0 :(得分:0)
那么,我正在写这篇文章,以寻求有关克服该问题的最佳方法的信息:
什么将是最好的方法主要是基于意见的,但是列出的最糟糕的方法是第一种,其中必须使两个变量(指针和标志)保持同步。 >
任何其他解决方案...
另一种解决方案是使用宏,例如。 g。:
#define destroy_player(p) do { /* whatever cleanup needed */; free(p), p = NULL; } while (0)
…
destroy_player(gi_ptr->player);