我已经开始写一个简单的控制台Yahtzee游戏进行练习.我只是对这个功能是否会泄漏内存有疑问.每次需要重新滚动骰子时都会调用滚动功能.
它的作用是创建一个动态数组.第一次使用它会存储5个随机值.对于下一次运行,除了你要保留的骰子外,它只会重新滚动.我有另一个功能,但由于它与这个问题无关,我把它留了出来
主功能
int *kast = NULL; //rolled dice
int *keep_dice = NULL; //which dice to re-roll or keep
kast = roll(kast, keep_dice);
delete[] kast;
Run Code Online (Sandbox Code Playgroud)
这是功能
int *roll(int *dice, int *keep) {
srand((unsigned)time(0));
int *arr = new int[DICE];
if(!dice)
{
for(int i=0;i<DICE;i++)
{
arr[i] = (rand()%6)+1;
cout << arr[i] << " ";
}
}
else
{
for(int i=0;i<DICE;i++)
{
if(!keep[i])
{
dice[i] = (rand()%6)+1;
cout << "Change ";
}
else
{
keep[i] = 0;
cout << "Keep ";
}
}
cout << endl;
delete[] arr;
arr = NULL;
arr = dice;
}
return arr;
}
Run Code Online (Sandbox Code Playgroud)
Jer*_*fin 12
是的,它可以泄漏.例如,使用cout可以抛出异常,如果是,delete则永远不会被调用.
您可能需要考虑返回一个,而不是自己分配动态数组std::vector.更好的是,将您的函数转换为适当的算法,该算法采用迭代器(在本例中为a back_insert_iterator)并将其输出写入其中.
编辑:仔细看一下,我觉得有必要指出我完全不喜欢这段代码的基本结构.你有一个功能,它真的做了两种不同的事情.您还有一对阵列,它们依赖于并行寻址.我将它重组为两个独立的函数,a roll和a re_roll.我将数据重组为结构数组:
struct die_roll {
int value;
bool keep;
die_roll() : value(0), keep(true) {}
};
Run Code Online (Sandbox Code Playgroud)
要进行初始滚动,请将这些向量(或数组,如果您真正坚持)传递给roll函数,该函数填充初始值.要进行重新滚动,请传递要重新滚动的向量,re-roll以便为其keep成员已设置为的任何die_roll获取新值false.
| 归档时间: |
|
| 查看次数: |
368 次 |
| 最近记录: |