在while循环中使用delete吗?

时间:2014-10-16 06:12:26

标签: c++ pointers

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

我有一个类Player,我想根据用户输入初始化一定次数。类Player的构造函数处理牌,然后检查棋盘(在不同级别处理),检查最终手牌有什么等等。所有牌都是随机处理的(没有用户输入)。

我希望这会在一个循环中一次又一次地发生,并显示统计数据,例如谁赢了,多少次,什么牌被击中等等。所以我的主要()这样做:

// 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 Teach Yourself C ++”,作者说我永远不应该重复使用已删除的指针。但是(不确定在这里)删除p [i]不会删除指针,但只有在对象数组中创建并由p + i指向的对象,是否正确?

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

另外我想可以不删除* p因为它会在main()结束时被删除? (稍后会有某种“休息”机制)。

3 个答案:

答案 0 :(得分:2)

是的,如果您使用 :),则应始终使用 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

答案 1 :(得分:1)

重用存储(重用对象)和分配新内存之间存在差异。你应该总是配对new-delete。如果使用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>(当移动很重或不可能时,保留指向对象的指针)。如果您知道尺寸(或Player[size]),请std::array<Player,Size>
  3. 如果必须,请使用智能指针的容器,例如: vector<unique_ptr<Player>>,但请先检查上面的内容(首选容器)。

答案 2 :(得分:1)

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

您也可以声明一个Player *p指针并使用array 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()); }