데이터 구조 및 알고리즘 과정에 동적 배열 데이터 구조를 구현하려고하는데 메모리 관리에 문제가있는 것 같습니다. 내 템플릿 클래스는 다음과 같습니다.동적 배열 데이터 구조를 구현할 때 "double free or corruption"오류가 발생했습니다.
ArrayList.h
#include <iostream>
#include <cstring>
using namespace std;
#define Length(array) (sizeof((array))/sizeof((array[0])))
template <class T>
class ArrayList
{
public:
ArrayList() {a = new T[1]; n = 0;}
~ArrayList() {delete [] a;}
int size();
int backingSize();
T get(int i);
T set(int i, T x);
void add(int i, T x);
T remove (int i);
private:
void resize();
T *a;
int n;
};
template <class T>
int ArrayList<T>::size() { return n; }
template <class T>
int ArrayList<T>::backingSize() { return Length(a); }
template <class T>
T ArrayList<T>::get(int i) { return a[i]; }
template <class T>
T ArrayList<T>::set(int i, T x)
{
T temp = a[i];
a[i] = x;
return temp;
}
template <class T>
void ArrayList<T>::add(int i, T x)
{
if (n+1 > Length(a)) resize();
for (int j = n; j > i; j--) a[j] = a[j-1];
a[i] = x;
n++;
}
template <class T>
T ArrayList<T>::remove(int i)
{
T temp = a[i];
for (int j = i; j < n-1; j++) a[j] = a[j+1];
n--;
if (Length(a) > 3*n) resize();
return temp;
}
template <class T>
void ArrayList<T>::resize()
{
if (n+1 > Length(a))
{
cout << "Making Bigger\n";
T* tempArr = new T[2*n];
memcpy(tempArr, a, n * sizeof(T));
delete [] a;
a = tempArr;
}
else // (Length(a) > 3*n)
{
cout << "Making Smaller\n";
T* tempArr = new T[n/2];
memcpy(tempArr, a, n * sizeof(T));
delete [] a;
a = tempArr;
}
}
I는 다음과 같은 주요 기능을 테스트
TestArrayList.cpp 코드는 컴파일하고 다음과 같은 출력으로 실행
#include "ArrayList.h"
#include <iostream>
using namespace std;
int main()
{
ArrayList <int> myList;
cout << myList.size() << "\n\n";
myList.add(0,15);
cout << myList.get(0) << ", " << myList.size() << ", " << myList.backingSize() << "\n";
myList.add(1,34);
cout << myList.get(1) << ", " << myList.size() << ", " << myList.backingSize() << "\n";
myList.add(2,23);
cout << myList.get(2) << ", " << myList.size() << ", " << myList.backingSize() << "\n";
myList.add(3,1);
cout << myList.get(3) << ", " << myList.size() << ", " << myList.backingSize() << "\n\n";
myList.~ArrayList();
}
터미널에 :
15, 1, 2
34, 2, 2
Making Bigger
23, 3, 2
Making Bigger
1, 4, 2
*** Error in `./TestArrayList': double free or corruption (fasttop): 0x000000000090c010 ***
Aborted
예상대로 작동하는 것처럼 보입니다. get 함수는 인덱스에 적절한 값을 반환하고 size 함수는 적절한 길이의 배열을 반환하며 seg fault는 없습니다. 그러나 backingSize()
함수는 항상 2를 반환하고 잘못된 메모리 관리와 관련이 있다고 가정하는 끝에 던져진 오류가 발생합니다. 나는 꽤 오랫동안 엉망이 되었기 때문에 어떤 도움을 주시면 감사하겠습니다.
또한 타입에 대한 복사 생성자, 할당 연산자 및 이동 대입 연산자를 정의해야합니다 (또는 삭제하십시오) – OMGtechy
디버거를 단계별로 실행하여 'delete []'를 두 번 누르는 위치를 결정할 수 있습니까? –
소멸자를 명시 적으로 호출하지 마십시오. 변수가 범위를 벗어날 때 자동으로 호출됩니다. – grep