我不明白以下代码中可能出现的问题。它会生成“未释放的指针被释放”错误。
#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也可以。 我做错了什么 ?
答案 0 :(得分:4)
问题是您在isPrime
调用之外定义的changeArray()
指针不会被changeArray()
更改。它的值被复制到释放数组的调用中,但是新分配的数组指针只存储在这个临时变量中,该变量在离开函数时被销毁。通话结束后,isPrime
中的main()
指针仍然指向呼叫前的同一位置,因此delete[]
中的main()
会尝试释放已经存在的内存被释放了。
要自己观察,请在调用isPrime
之前和之后打印changeArray()
的值,并在isPrime
内打印新分配changeArray()
的值。
解决方案是通过引用传递isPrime
:
void changeArray(bool*& isPrime){
delete[] isPrime;
isPrime = new bool[10];
}