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

1 に答える 1

4

問題はisPrime、呼び出しの外部で定義したポインターがchangeArray()によって変更されないことchangeArray()です。その値は呼び出しにコピーされ、そこで配列が解放されますが、新しく割り当てられた配列のポインターは、関数を離れるときに破棄されるこの一時変数にのみ格納されます。呼び出し後も、isPrimeinのポインタはmain()呼び出し前と同じ場所を指しているため、delete[]inmain()はすでに解放されているメモリを解放しようとします。

これを自分で観察するにはisPrime、への呼び出しの前後changeArray()の値と、新しく配置されたisPrime内部の値を出力しchangeArray()ます。

isPrime解決策は、参照渡しすることです。

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