c++ 用链表写的一个array类 里面的内存分配与释放出了问题 望高人解决 希望能说清楚一点 小菜菜

lhdgriver 2009-04-08 12:25:46
直接贴代码
/*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;
}
...全文
120 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaaa3105563 2009-04-08
  • 打赏
  • 举报
回复
学习·············
hoomien 2009-04-08
  • 打赏
  • 举报
回复
又长又乱!为什么不
下呢?
beyond071 2009-04-08
  • 打赏
  • 举报
回复
void Array <T>::myDelete( const int position = 0 ) 
{
if ( position == 0 )
{
PList <T> *ptr = list;
PList <T> *tempPtr;
while ( ptr->pNext != NULL )
{
tempPtr = ptr;
ptr = ptr->pNext;
delete tempPtr;
size--;
}
if (size != 0)
{
delete ptr;
list->pBefore = NULL;
list->pNext = NULL;
}
}
}

加个判断,避免对空list进行再次删除。
beyond071 2009-04-08
  • 打赏
  • 举报
回复
只用list->pNext是否为空作为判断准则,这样的双向链表是有缺陷的:
1)list若为空,也就是一个元素也没有,此时list->pBefore和list->pNext应该等于什么呢?
2)若只有一个元素的list,其list->pBefore和list->pNext又应该等于什么呢?
尽管他们都没有前驱和后驱,但它们不应该混淆为一体!这是delete设计中的问题根源。
夹心饼干 2009-04-08
  • 打赏
  • 举报
回复
delete只是把指针指向的那块内存给释放掉了,但是指针本身还是存在的,这个就是所谓的野指针
良好的习惯,就是当你delete后让指针指向空ptr = NULL
lhdgriver 2009-04-08
  • 打赏
  • 举报
回复
那个就是我不解的地方
我在前面把那些都给delete掉了
为何后边写
while( ptr != NULL )时 竟然是 ptr != NULL 它竟然是对的~~~
没有delete干净??
「已注销」 2009-04-08
  • 打赏
  • 举报
回复
帮你粗略的调试了一下:你在myDelete里删除时指针越界了。
  • 打赏
  • 举报
回复
好长,帮up下。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧