Я не понимаю, что может быть не так в следующем коде. Он генерирует ошибку «освобожден указатель не был выделен».
#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, это тоже нормально.
Что я сделал не так ?
Проблема в том, что isPrime
указатель, который вы определяете вне вызова changeArray()
не изменяется changeArray()
, Его значение копируется в вызов, где освобождается массив, но указатель вновь выделенного массива сохраняется только в этой временной переменной, которая уничтожается при выходе из функции. После звонка isPrime
указатель в main()
по-прежнему указывает на то же место, что и до вызова, и поэтому delete[]
в main()
пытается освободить память, которая уже была освобождена.
Чтобы убедиться в этом, напечатайте значение isPrime
до и после звонка changeArray()
и стоимость вновь выделенного isPrime
внутри changeArray()
,
Решение состоит в том, чтобы пройти isPrime
по ссылке:
void changeArray(bool*& isPrime){
delete[] isPrime;
isPrime = new bool[10];
}
Других решений пока нет …