2017-12-04 14 views
1

전에 모두 내가 이미 대답을 검색했다는 것을 알려주지 만, 나는 그 문제를 왜 설명하고 있는지 찾을 수 없습니다.삭제 이해 [+] C++

임 지금 그래서 전에,이 방법으로 C++를 사용하는 날이 목적과 일부 comcepts의 이해를 학습 것을 당신에게 말을하지 말해

C++

를 배우는 학생 및 메신저.

마지막 문장에서 프로그램이 중단됩니다. delete [] tempVector; 내가 [[] 벡터 삭제 이후 왜 일어나는 지 이해할 수 없다. 잘 작동합니다.

오류 : arr.exe 플레이는 중단 점

잘못하고 무엇 메신저 이해 도와주세요 촉발했다.

고맙습니다.

class BetterArray 
{ 
private: 

    int* vector; 
    int count; 

public: 

    BetterArray(int value); 
    BetterArray(int* vec, int size); 
    ~BetterArray(); 

    void add(int value); 

    int* getArray(); 

}; 

BetterArray::BetterArray(int value) 
{ 
    count = 1; 

    vector = new int[1]; 
    vector[0] = value; 
} 

void BetterArray::add(int value){ 

    int* tempVector = new int[count + 1]; 

    for (int i = 0; i < count; i++) 
     tempVector[i] = vector[i]; 

    tempVector[count] = value; 

    count++; 

    delete[] vector; 

    vector = tempVector; 

    delete[] tempVector; // programa crahses here. 
} 
+3

나는 당신이 말한 곳에서 프로그램이 충돌한다고 생각하지 않습니다. 그러나 방금 전에 당신이 방금 복사 한 데이터를 해제했다.'delete [] tempVector; '는 두 포인터가 같은 위치를 가리 키므로'delete [] vector;'와 같다. – drescherjm

+3

'delete [] vector;에서'vector'는 무엇입니까? –

+2

'vector'는 어떻게 선언됩니까? –

답변

3

크래시가 delete 인 경우가 종종 힙 손상의 결과입니다. tempVector 포인터를 vector에 할당하면 두 포인터가 모두 같은 메모리 위치를 가리 킵니다. 따라서 tempVector을 삭제하면 vector이 삭제됩니다. vector은 이제 할당되지 않은 메모리를 가리 킵니다.

이제 vector에 쓸 것으로 가정하면 할당되지 않은 메모리에 쓰면 힙이 손상됩니다. 이것은 정의되지 않은 동작이지만 힙 관리자가 손상을 감지하면 충돌이 발생합니다.