是否正确删除了* bool数组C ++

时间:2014-12-12 08:44:08

标签: c++ arrays pointers memory-leaks delete-operator

我正在尝试缩小*bool的数组,但我不确定它是否被正确删除。

这是我的源代码......

bool *oldStore;


void shrinkArray(int i)
{
    int k;
    bool *newStore;
    for(k=0; k<i; k++)
    {
        newStore[k] = oldStore[k];
    }

    for(; k<originalSize; k++)
    {
        delete[] oldStore[k];
    }

    delete[] oldStore;
    oldStore = newStore;
}

例如,如果我想将数组缩小到5并且数组的原始大小为15,那么它将保留前五个并删除最后十个,但我不是确定我的记忆是否正确管理。

3 个答案:

答案 0 :(得分:1)

最简单的代码是: -

void shrinkArray(int i)
{
    int k;
    bool *newStore = new bool[i];
    for(k=0; k<i; k++)
    {
        newStore[k] = oldStore[k];
    }

    delete [] oldStore;   //assuming oldstore was allocated using new []..
    oldStore = newStore;

}

答案 1 :(得分:1)

在进入编码细节之前考虑一下方法设计。我假设你有一个ínt数组,你在代码中的某个地方新建了。

  1. 想想谁“拥有”这个阵列?在某个地方创建int数组并在其他地方简单地删除[]可能不是一个好主意。请查看以下链接:What is a smart pointer and when should I use one?

  2. 想想你的newStore数组会发生什么。是应该替换oldStore还是要两个数组并行存在?如果你只是将newStore放在堆上谁/何时以及在何处再次删除[]它。

答案 2 :(得分:0)

你的代码错了。您声明了指针newStore,但既没有初始化它也没有分配将由此指针指向的内存

bool *newStore;

所以下一个循环有不确定的行为。

for(k=0; k<i; k++)
{
    newStore[k] = oldStore[k];
}

此外,如果指针oldStore指向的数组的每个元素的类型bool *依次是指针,则oldStore本身应具有类型bool **

如果是这样,那么正确的函数可能看起来像

void shrinkArray( int n )
{
    if ( n < originalSize )
    {
        bool **newStore  = new bool * [n];

        int i = 0;
        for ( ; i < n; i++ ) newStore[i] = oldStore[i];

        for ( ; i < originalSize; i++ ) delete oldStore[i];

        delete [] oldStore;

        oldStore = newStore;
        originalSize = n;
    }
}

考虑到oldStore也应该有bool **类型。

否则,如果原始数组的每个元素都具有类型bool,则代码将类似于

void shrinkArray( int n )
{
    if ( n < originalSize )
    {
        bool *newStore  = new bool [n];

        int i = 0;
        for ( ; i < n; i++ ) newStore[i] = oldStore[i];
        // Or
        // std::copy( oldStore, oldStore + n, newStore );

        delete [] oldStore;

        oldStore = newStore;
        originalSize = n;
    }
}

考虑到使用标准容器std::vector<bool *>std::vector<bool>会更好更简单,具体取决于容器元素的类型。