2012-12-27 74 views
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; 
} 

但是,如果我直接在主把函数的代码,它是确定。 如果我不使用MPI,也可以。 我做错了什么?

回答

4

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

观察这个自己,前后调用changeArray()后打印的isPrime值,内部changeArray()新alocated isPrime值。

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

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

非常感谢你。 – Ericswed