gpt4 book ai didi

由于破坏 C 中的 "object"而更改指针

转载 作者:行者123 更新时间:2023-11-30 16:38:10 24 4
gpt4 key购买 nike

作为我目前正在参加的类(class)的一部分,我们正在使用 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;

问题如下:

如果我们要坚持本类(class)大部分内容中使用的设计理念,我们将使用 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 标志修复了它),这是因为指针是通过副本传递的,而不是通过通过引用,在调用“对象”“析构函数”后,它不会设置为 NULL,因此将其与 NULL 进行比较并不是了解指针是否被释放的可靠方法。

那么,我写这篇文章是为了寻求解决这个问题的最佳方法的意见:

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

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

最佳答案

I am writing this, then, to ask for input on what would be the best way to overcome this problem: …

最好的方法主要是基于意见的,但在您列出的最差方法中,第一种方法必须保持两个变量(指针和标志)同步。

Any other solution…

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

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

destroy_player(gi_ptr->player);

关于由于破坏 C 中的 "object"而更改指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47602512/

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