gpt4 book ai didi

C++ 这个函数会泄漏吗?

转载 作者:太空狗 更新时间:2023-10-29 23:23:04 25 4
gpt4 key购买 nike

我已经开始编写一个简单的控制台 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;

这是函数

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;
}

最佳答案

是的,它会泄漏。例如,使用 cout 可能会引发异常,如果发生异常,您的 delete 将永远不会被调用。

与其自己分配一个动态数组,不如考虑返回一个 std::vector。更妙的是,将您的函数转换为适当的算法,该算法采用迭代器(在本例中为 back_insert_iterator)并将其输出写入那里。

编辑:更仔细地看,我觉得有必要指出我真的完全不喜欢这段代码的基本结构。你有一个功能实际上在做两种不同的事情。您还有一对依赖于并行寻址的数组。我将其重组为两个独立的函数,rollre_roll。我将数据重组为结构数组:

struct die_roll { 
int value;
bool keep;

die_roll() : value(0), keep(true) {}
};

要进行初始滚动,您需要将这些 vector (或数组,如果您真的坚持的话)传递给 roll 函数,该函数会填充初始值。要进行重新滚动,您将 vector 传递给 re-roll,它重新滚动以获取其 keep 成员已设置为 的任何 die_roll 的新值>假

关于C++ 这个函数会泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2110302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com