Указатель освобождается

Я не понимаю, что может быть не так в следующем коде. Он генерирует ошибку «освобожден указатель не был выделен».

#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

Решение

Проблема в том, что isPrime указатель, который вы определяете вне вызова changeArray() не изменяется changeArray(), Его значение копируется в вызов, где освобождается массив, но указатель вновь выделенного массива сохраняется только в этой временной переменной, которая уничтожается при выходе из функции. После звонка isPrime указатель в main() по-прежнему указывает на то же место, что и до вызова, и поэтому delete[] в main() пытается освободить память, которая уже была освобождена.

Чтобы убедиться в этом, напечатайте значение isPrime до и после звонка changeArray()и стоимость вновь выделенного isPrime внутри changeArray(),

Решение состоит в том, чтобы пройти isPrime по ссылке:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]