2012-12-27 4 views
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

changeArray() 호출 외에서 정의한 isPrime 포인터의 포인터는 changeArray()에 의해 변경되지 않습니다. 이 값은 배열에있는 호출에 복사되지만 새로 할당 된 배열의 포인터는 함수를 떠날 때 파기되는 임시 변수에만 저장됩니다. 호출 후 main()에있는 isPrime 포인터는 호출 전과 동일한 위치를 계속 가리므로 delete[] (main())은 이미 해제 된 메모리를 해제하려고 시도합니다.

이 직접 관찰 전 changeArray()에 대한 호출 후 isPrime의 값을 출력하고, 새로 changeArray() 내부 isPrime alocated의 값합니다.

이 솔루션은 참조로 isPrime을 전달하는 것입니다 :

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

가 대단히 감사합니다. – Ericswed

관련 문제