c++ 用链表写的一个array类 里面的内存分配与释放出了问题 望高人解决 希望能说清楚一点 小菜菜
直接贴代码
/*Array.h
复制构造函数和析构函数的内存释放还有问题
*/
#ifndef ARRAY_H_
#define ARRAY_H_
#include <iostream>
using namespace std;
template<typename T>//双向链表,用于存储
struct PList
{
T value;
PList<T> * pNext;
PList<T> * pBefore;
};
template<typename T>
class Array
{
public:
Array( int _size = 0 );
Array( const Array & x );
void push_back( const T & source );
void myDelete( const int position = 0 );//当不传入参数时,默认删除全部
void merge( const T & dest, T & source );
T & operator []( int position );
T & operator = ( const Array & source );
void insert( const int position );
int getSize();
~Array();
private:
PList<T> *list;
int size;
};
template<typename T>
Array<T>::Array( int _size ):list(NULL)
{
size = _size;
if ( size == 0 ) return;
int tempSize = _size - 1;
PList<T> *ptrBefore, *ptrNext;
list = new PList<T>;
list->pBefore = NULL;
ptrBefore = list;
while ( tempSize )
{
tempSize--;
ptrNext = new PList<T>;
ptrNext->pBefore = ptrBefore;
ptrBefore->pNext = ptrNext;
ptrBefore = ptrNext;
}
ptrBefore->pNext = NULL;
}
template<typename T>
Array<T>::Array( const Array & x ):list(NULL)
{
size = x.size;
int tempSize = x.size - 1;
list = new PList<T>;
PList<T> *ptrBefore, *ptrNext, *ptrSource = x.list;
list->value = ptrSource->value;
list->pBefore = NULL;
ptrBefore = list;
while ( tempSize )
{
tempSize--;
ptrNext = new PList<T>;
ptrNext->pBefore = ptrBefore;
ptrBefore->pNext = ptrNext;
ptrSource = ptrSource->pNext;
ptrBefore = ptrNext;
ptrBefore->value = ptrSource->value;
}
ptrBefore->pNext = NULL;
}
template<typename T>
void Array<T>::push_back( const T & source )
{
size++;
PList<T> *ptrSource = new PList<T>;
PList<T> *ptr = list;
ptrSource->pNext = NULL;
ptrSource->value = source;
while ( ptr->pNext != NULL ) ptr = ptr->pNext;
ptr->pNext = ptrSource;
ptrSource->pBefore = ptr;
}
template<typename T>
void Array<T>::myDelete( const int position = 0 )
{
if ( position == 0 )
{
PList<T> *ptr = list, *tempPtr;
while ( ptr->pNext != NULL )
{
tempPtr = ptr->pNext;
delete ptr;
size--;
ptr = tempPtr;
}
delete ptr;//貌似很多问题啊~~
}
int i = 4;
}
template<typename T>
void Array<T>::merge( const T & dest, T & source )
{}
template<typename T>
T & Array<T>::operator []( int position )
{
PList<T> *ptr = list;
int num = position;
while ( num )
{
num--;
ptr = ptr->pNext;
}
return ptr->value;
}
template<typename T>
void Array<T>::insert( const int position )
{}
template<typename T>
int Array<T>::getSize()
{
return size;
}
template<typename T>
Array<T>::~Array()
{
PList<T> *ptr = list, *tempPtr;
if ( ptr == NULL ) return;
while ( ptr->pNext != NULL )
{
tempPtr = ptr->pNext;
delete ptr;
ptr = tempPtr;
}
delete ptr;
cout << size << endl;
}
#endif
-----------------------------------我是分割线----------------------------------------
/*main*/
#include <iostream>
using namespace std;
#include "Array.h"
int main()
{
Array<int> a(5);
for ( int i = 0; i < 5; i++ ) a[i] = i;
Array<int> b(a);
for ( int i = 0; i < 5; i++ ) cout << b[i] << " ";
cout << a.getSize();
a.push_back( a[1] );
for ( int i = 0; i < a.getSize(); i++ ) cout << a[i] << " ";
cout << endl;
cout << a.getSize();
cout << b.getSize() << endl;
a.myDelete();//有问题
a.myDelete();//这个地方有问题
return 0;
}