2013-11-26 4 views
0

내 프로그램에서 메모리 힙 손상 오류가 발생하여 충돌합니다. 문제가되는 코드 블록은 다음과 같습니다. "delete [] p;"에 문제가 나타납니다. 코드 블록 이 블록 코드의 목적은 배열 (항목 - 클래스 헤더에 정의 된 항목)의 크기를 조정하는 것입니다. 이렇게하려면 1. 새로운 적절한 용량의 새 배열 (복사본)을 할당합니다. 2. 이전 배열 (항목)을 새로운 (크기 조정 된) 배열 "복사"로 복사합니다. 3. 이제 더 이상 필요 없기 때문에 복사본을 삭제하려고합니다. 마지막 지점에서 확실히 오류가 발생합니다. 올바르게 수행하는 방법은 무엇입니까? - "복사"가 올바르게 처리하는 메모리를 해제하는 방법을 의미합니다. 메모리 누수 방지? 생성자와 소멸자를 넣고 정의복사 후 동적 배열 삭제

template <class Item> class MinPQ 
{ 
    private: 

     Item *items; 
     int queueSize; 
     int N; 

     void resize(int capacity); 
     bool greater(int i, int j); 
     void exch(int i, int j); 
     void swim(int k); 
     void sink(int k); 

    public: 

     MinPQ(); 
     ~MinPQ(); 
     void insert(Item item); 
     Item delMin(); 
     void print(); 
     inline int size(){return N;} 
     inline bool isEmpty(){return N == 1;} 
}; 

:

template <class Item> void MinPQ<Item>::resize(int capacity) 
{ 
    Item *copy = new Item[capacity];//capacity = stack size 


    for(int i = 0; i < N; ++i) 
    { 
     copy[i] = items[i]; 
    } 
    Item *p = items; 
    items = copy; 
    delete[] p; 

    p = NULL;//avoid dangling pointer 
} 

항목은 다음과 같이 클래스에 정의 귀하의 문제 때문에 당신이하지 않은 사실 가능성이

template <class Item> MinPQ<Item>::MinPQ() 
{ 
    queueSize = 2; 
    N = 0; 
    items = new Item[queueSize]; 
} 

template <class Item> MinPQ<Item>::~MinPQ() 
{ 
    delete [] items; 
    items = NULL; 
} 
+3

1. 수업이 3 규칙을 위반 한 것으로 보입니다. 2.'std :: array' 또는'std :: vector'를 사용하십시오. –

+0

여기에 표시되는 기능을 실제로 * 호출하는 코드를 제공하는 것을 잊었습니다. 그러나,'queuesize'가 내가하는 일을한다고 생각한다면, 당신은 그 함수에서'capacity'로 설정해야합니다. –

답변

0

내가 복사 생성자를 정의하지 않았거나 내가 = 연산자를 오버로드하지 않은 사실에 기인하지 않은 한 문제에 따라이 문제를 해결할 수 있습니다. 할당 된 배열의 정의되지 않은 메모리 청크에 액세스하고 있다는 사실이 원인이었습니다. 분명히 : N 요소의 배열을 정의했지만 N에서 N-10이라고 말했습니다. 프로그램의 특정 지점에서 정의 된 N-10 요소 중 일부와 정의되지 않은 요소 중 일부 사이의 교환을 수행합니다 . 이것은 충돌을 일으키는 버그입니다. 어쨌든 내 질문에 답해 주셔서 감사합니다.

1

복사 생성자 나 복사 할당 연산자를 정의하고 (어딘가에서) 당신의 큐를 복사하려고합니다. 포인터의 값을 복사하지만 범위를 벗어나면 메모리가 해제됩니다. 그런 다음 다른 복사본은 범위를 벗어나서 이미 해제 된 메모리를 해제하려고 시도합니다.

당신은 Rule of 3