在while循环中使用delete吗
do I use delete in while loop?
我正在编写一个纸牌游戏(扑克)应用程序作为学习项目,并有一个关于删除指针的问题。先介绍一下背景:
我有一个类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
更多提示:
- 在C++中避免使用
new
/delete
,如果可以的话,可以使用std::unique_ptr
或std::shared_ptr
- 如果可以的话,避免使用指针容器,使用对象容器-
std::vector<Player>
(最常见)、std::deque<Player>
(当移动很重或不可能时,保留指向对象的指针)。或者std::array<Player,Size>
(如果您知道大小)(或者Player[size]
) - 如果必须,请使用智能指针容器,例如
vector<unique_ptr<Player>>
,但请先检查上面的内容(首选对象容器)
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 运算符C++ "delete []"仅删除 2 个前值
- while循环中while循环的时间复杂度是多少
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 擦除while循环中迭代的元素
- 为什么我不能在 while 循环中创建线程?
- 退出简单while循环时出现问题
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 嵌套While循环不起作用(C++问题)
- g++用户定义的动态链接库上的全局new和delete运算符
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 使用 GMP 的 while 循环出现问题
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 为什么"delete"关键字不删除节点?
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 为什么在 while 循环中返回表达式不起作用
- 在while循环中使用delete吗