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

sta*_*orn 2 c++ memory-leaks

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

  • @Travis:最好不要将`auto_ptr`与使用`new []`分配的内存一起使用. (3认同)