在while循环中使用delete吗

do I use delete in while loop?

本文关键字:delete while 循环      更新时间:2023-10-16

我正在编写一个纸牌游戏(扑克)应用程序作为学习项目,并有一个关于删除指针的问题。先介绍一下背景:

我有一个类Player,我想根据用户输入对其进行一定次数的初始化。类玩家的构造函数发牌,然后检查牌(在不同的类中发),检查最后一手牌玩家有什么等等。所有牌都是随机发的(没有用户输入)。

我希望这种情况在一段时间内反复发生,并显示统计数据,如谁赢了,多少次,什么手被击中等。所以我的main()这样做:

// GET NUMBER OF PLAYERS 
unsigned numOfPls = 1;
Player::getNumOfPls(numOfPls);
// CREATE POINTER TO numOfPls OBJECTS TYPE PLAYER
Player *p[numOfPls];
while(true){
    Deck::DeckObj().shuffleDeck();
    for (unsigned i=0; i<numOfPls; i++){
        p[i] = new Player;
    }
    // DO I DELETE THIS WITH EACH WHILE ??? 
    for (unsigned i=0; i<numOfPls; i++){
        //delete p[i];
    }
}
return 0;

我不确定是否应该每次都删除p[I]。我正在读"Sams自学C++",作者说我永远不应该重复使用删除的指针。但(这里不确定)删除p[i]不会删除指针,而是只删除在对象数组中创建并由p+i指向的对象,对吗?

另一方面(如果我的上述假设是正确的),不删除它并用另一个时间创建的另一个对象覆盖对象是否安全?正确的方法是什么?

另外,我想不删除*p是可以的,因为它会随着main()的结束而被销毁?(稍后将应用某种"中断"机制)。

是的,如果您使用过NEW,则应始终使用DELETE:)但我确实认为你的情况太复杂了。

相反,我可能建议您让C++处理好这一点,或者换句话说——在这种特殊情况下,NOT使用指针要容易得多。

while(true){
  Player p[numOfPls];
  Deck::DeckObj().shuffleDeck();
  for (unsigned i=0; i<numOfPls; i++){
    // DO WHATEVER YOU WANT with the class, i.e. process data
  }
} //End of the loop

是的,您需要在while循环中删除每个分配了new的对象。否则,在下一次while迭代中,指针数组将被新指针覆盖,从而从以前的分配中泄漏内存。

您也可以只声明一个Player *p指针,并使用数组new进行分配:

p = new Player[numOfPls];

和阵列删除销毁:

delete[] p;

当然,有更好、更安全的方法来存储Player:数组

std::vector<Player> p(numOfPls);

或者,如果你真的想要指针,可以使用自动删除的智能指针:

std::vector<std::unique_ptr<Player> > p(numOfPls);
for(unsigned int i=0;i<numOfPls;i++) { p[i].reset(new Player()); }

重用存储(重用对象)和分配新内存是有区别的。您应该始终对新删除进行配对。如果使用new创建新对象(重用数组中的指针槽,而不是存储器),则必须首先删除旧的(有效的)指针。

但是您使用的是C++,请使用std::vector或std::deque;)


作者说我永远不应该重复使用删除的指针这是关于存储,关于去引用,关于指针指向的内存,而不是指针本身:

Player* p = new Player();
delete p; // here p still has some value, but you should not dereference it
p->do_something(); // this is bad after the delete
p = new Player();  // p is valid again
p->do_something(); // ok
delete p; p = nullptr; // this is what you should do if you want to check it
if(p) p->do_something(); // won't execute now

更多提示:

  1. 在C++中避免使用new/delete,如果可以的话,可以使用std::unique_ptrstd::shared_ptr
  2. 如果可以的话,避免使用指针容器,使用对象容器-std::vector<Player>(最常见)、std::deque<Player>(当移动很重或不可能时,保留指向对象的指针)。或者std::array<Player,Size>(如果您知道大小)(或者Player[size]
  3. 如果必须,请使用智能指针容器,例如vector<unique_ptr<Player>>,但请先检查上面的内容(首选对象容器)