2012-12-27 72 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