【问题标题】:Multiple uses of new and delete多次使用new和delete
【发布时间】:2013-05-21 12:11:55
【问题描述】:

我正在使用 C++ 模拟两个玩家之间的传统纸牌游戏:我定义了一个“纸牌”结构,以便

card sample;
cout << sample.numb << " of " << sample.suit << " ownded by player " << sample.own

读取例如“黑桃 10 归玩家 2 所有”。

我设置了一个向量“deck”(大小为 40)来跟踪每张牌,并且我在游戏的每一步动态分配向量“g1”“g2”和“tab”,以便处理玩家 1 的手、玩家 2 的手和桌子上的牌以及三个分开的物体(这对于游戏本身来说是必需的)。

由于玩家不断将牌放在桌子上并获得/失去新牌,因此尺寸不断变化,所以每次我都做这样的事情:

delete g1;
delete g2;
delete tab;
n1=count (1,deck);  // this counts how many cards in "deck" have .own field==1
n2=count (2,deck);  // this counts how many cards in "deck" have .own field==2
nt=count (0,deck);  // cards having .own field == 0 are on the table
g1 = new card [n1];
g2 = new card [n2];
tab = new card [nt];
k=0;               // using this to move through the vectors I just re-allocated
for (i=0;i<40;i++) {
  if(deck[i].own==1) {
     g1[k]=deck[i];
     k++;
  }
}
// then I fill "g2" and "tab" pretty much in the same way

脚本编译并运行,但经过几轮(正确执行)后,我得到“下一个大小无效(快速)”和段错误。 环顾四周,我发现这通常发生在您尝试删除两次或类似情况时。 我的脚本不会删除任何内容两次,但我怀疑如此频繁地使用 new-delete-new 已被弃用,这可能是我的问题的原因。

想法?

编辑我使用 std::vector 解决了我的问题,我建议对遇到相同问题的任何人做同样的事情;感谢所有回答的人。

和平,

汤姆

【问题讨论】:

  • 错误可能发生在你的'count(int, deck)'上。
  • @vadz 这是一个非常简单的函数,例如 n=0;对于 (i=0;i
  • 您发布的代码中唯一的问题是错误的删除样式(请参阅答案),以及使用原始指针容易出错。您未发布的代码中可能存在的问题:您可能没有在每次循环之前将k 设置回零;您可能会将own 与其他循环中的错误值进行比较;在第一次删除之前,您可能没有将指针初始化为 null。
  • 你在哪里设置“deck[i].own =1;” ?
  • 如果你真的想用四个字母的话,我相信卡片的价值叫做“等级”。

标签: c++ dynamic-memory-allocation delete-operator


【解决方案1】:

您最好对 g1、g2 和 tab 使用数组删除: 例如:删除 [] g1;

当然,最好使用 std::vector 而不是自己直接处理内存管理。

【讨论】:

  • 感谢您的快速回答,我按照您的建议尝试了数组删除,但没有解决太多。我将尝试查看 std::vector 文档。
【解决方案2】:

如果一副牌有 40 张牌,那么没有玩家可以拥有超过 40 张牌,而桌子上也不能有超过 40 张牌。只需创建 40 张卡片的数组。动态分配在这里是多余的。

【讨论】:

  • 啊,理性的声音!呃……呃……但是如果你有四个玩家呢?!? ;)
  • @NikBougalis - 不会改变基础分析。每手牌最多包含 40 张牌;这足够小,没有必要通过重新分配阵列以完全适合当前卡片数量的所有旋转。
  • 嗯...我在讽刺皮特。
  • @PeteBecker 是的,你是对的,但无论如何我想借此机会学习一些动态分配,所以我尝试写一些过于优雅的东西(最终变得过于丑陋,呃)。跨度>
猜你喜欢
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2011-05-27
相关资源
最近更新 更多