动态分配内存给连接的玩家,然后在他离开时销毁它(混合类型)

Posted

技术标签:

【中文标题】动态分配内存给连接的玩家,然后在他离开时销毁它(混合类型)【英文标题】:Dynamically Allocate Memory to a Connecting Player then Destroy it when he leaves (Mixed Types) 【发布时间】:2014-09-03 21:11:08 【问题描述】:

我目前正在处理一个涉及玩家的 C++ 项目,每个玩家都需要在服务器上存储关于他的信息,以确定他在做什么或它应该如何响应。服务器最多可以有 1000 个插槽,我不想让未使用的内存只分配给程序,而不是在玩家连接或加入时创建和销毁。

我知道我可以像这样动态分配内存:

int *Pointer = new int Example[10];

这将允许我存储 10 个整数,我可以保存有关该播放器的一些信息。但是我不知道什么以及我为什么要问这个问题:

如何使用它或具有类似功能的东西来存储播放器的信息。就像专门用于保存玩家数据的结构或类一样。等他一走就删掉?

我需要它保存的一个示例是混合范围的值:

double Pos[3];
int Mode;
string Name;

换句话说,我需要它保存混合类型的变量,并且能够将其直接链接回与之相关的玩家 ID?

谢谢。

【问题讨论】:

创建一个管理所有玩家数据的类,创建一个std::unique_ptr 分配对象,在他们断开连接时销毁unique_ptr? 好的,谢谢,我会调查的 :)。我在谷歌上快速点击了几下,它看起来就像我正在寻找的东西。感谢您的帮助,并为愚蠢的问题感到抱歉。我还在学习:)。 @user1591117 - 当您在编译时预先知道条目数时,为什么需要动态分配?您只需要int Example[10]; 如果仅在运行时知道示例的数量,那么更好的选择是使用std::vector<Example> 我需要,因为有 1000 个玩家名额。虽然如果只有 10 个人在玩呢。在这种情况下,我已经为另外 990 个播放器分配了内存,这会浪费内存。据我所知,unique_ptr 将允许我为每个玩家动态分配内存,并能够将此指针追溯到特定的玩家 ID。如果我能解决这个问题,那么如果只有 10 个玩家,我将能够让我的服务器只保存 10 个玩家的内存。或者如果这个数字达到了 1000 个。 @user1591117:这就是我们建议std::vector<Player> 的原因。它会根据需要增长。它可以从 2 名玩家开始,发展到 100 万。 【参考方案1】:

您可以定义一个Player 类来存储玩家的信息。

class Player 
public:
  double Pos[3];
  int Mode;
  string Name;
;

然后您可以定义一个map 来将玩家ID 与Player 对象相关联。

map<int, Player*> playerList;

连接播放器时,可以这样分配内存:

Player *p = new Player();
int playerID = xxx;
playerList[xxx] = p;  //store the <playerID, p> relationship in the map

然后你就可以随意访问字段了:

p->Pos[i] = xxx;
p->Mode = xxx;
p->Name = xxx;

当玩家离开时,你可以这样释放内存:

int playerID = xxx;
Player *p = playerList[playerID];
delete p;  //deallocate the Player class
playerList.erase(playerID); //deallocate the map entry that stores the <playerID, p> pair 

class的更高级用法,可以参考这个tutorial on classes。 您也可以参考this,了解如何使用map

【讨论】:

这是正确的概念,但我强烈建议尽可能使用智能指针,而不是使用原始指针。 这是我最初尝试做的,但是我无法将指针的值分配给玩家。在此之后,我开始使用向量包含,这让我很困惑。我还没有弄清楚如何将指针、智能或普通指针直接链接到特定的玩家 ID。因为一切都需要“恒定值”。其中一个 playerid,将在函数 OnPlayerConnect 期间发生变化。比如可能是一个指针数组 int *pInfo[MAX_PLAYERS];这从来没有奏效。我尝试了很多猜测和谷歌搜索。 @user1591117 根据您的描述,我已经更新了上面的答案。这能回答你的问题吗? 没有投票,因为指针。你甚至不需要智能指针。 map&lt;int, Player&gt; 工作得很好。我什至会考虑std::set&lt;Player, Player::OrderByName&gt;(如果你不提供明确的顺序,std::set 会尝试Player1 &lt; Player2

以上是关于动态分配内存给连接的玩家,然后在他离开时销毁它(混合类型)的主要内容,如果未能解决你的问题,请参考以下文章

动态内存——动态内存与智能指针

动态内存和智能指针

动态内存

CH12 动态内存

彻底销毁动态分配对象的向量

动态内存1(动态内存与智能指针)