正在释放指针

Pointer being freed

本文关键字:指针 释放      更新时间:2023-10-16

我不明白下面的代码有什么问题。生成一个"被释放的指针未被分配"错误。

#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;
}

但是如果我把函数的代码直接放在main中,它是可以的。如果我不使用MPI也没关系。我做错了什么?

问题是您在调用changeArray()之外定义的isPrime指针没有被changeArray()改变。它的值被复制到调用中,在调用中释放数组,但是新分配的数组指针仅存储在这个临时变量中,该变量在离开函数时被销毁。在调用之后,main()中的isPrime指针仍然指向调用前的相同位置,因此main()中的delete[]试图释放已经释放的内存。

要自己观察,在调用changeArray()之前和之后打印isPrime的值,以及在changeArray()中新分配的isPrime的值。

解决方案是通过引用传递isPrime:
void changeArray(bool*& isPrime){  
    delete[] isPrime;
    isPrime = new bool[10];   
}