指针被释放

时间:2012-12-27 11:01:53

标签: c++ pointers mpi free delete-operator

我不明白以下代码中可能出现的问题。它会生成“未释放的指针被释放”错误。

#include "mpi.h"

using namespace std;

void changeArray(bool* isPrime){  
    delete[] isPrime;
    isPrime = new bool[10];   
}

int main(int argc, char * argv[])
{
    int size, rank;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    bool* isPrime = new bool[1000];

    changeArray(isPrime);

    delete[] isPrime;

    MPI_Finalize();

    return 0;
}

但是如果我把函数的代码直接放在main中,那就没关系。 如果我不使用MPI也可以。 我做错了什么 ?

1 个答案:

答案 0 :(得分:4)

问题是您在isPrime调用之外定义的changeArray()指针不会被changeArray()更改。它的值被复制到释放数组的调用中,但是新分配的数组指针只存储在这个临时变量中,该变量在离开函数时被销毁。通话结束后,isPrime中的main()指针仍然指向呼叫前的同一位置,因此delete[]中的main()会尝试释放已经存在的内存被释放了。

要自己观察,请在调用isPrime之前和之后打印changeArray()的值,并在isPrime内打印新分配changeArray()的值。

解决方案是通过引用传递isPrime

void changeArray(bool*& isPrime){  
    delete[] isPrime;
    isPrime = new bool[10];   
}