4

我不明白下面的代码有什么问题。它会生成“未分配的指针被释放”错误。

#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 也可以。我做错了什么 ?

4

1 回答 1

4

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

要自己观察这一点,请打印isPrime调用前后changeArray()的值,以及新分配的isPrimeinside的值changeArray()

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

void changeArray(bool*& isPrime){  
    delete[] isPrime;
    isPrime = new bool[10];   
}
于 2012-12-27T11:27:58.583 回答