回 帖 发 新 帖 刷新版面

主题:[讨论]关于VC++6.0下 delete []动态释放指针数组空间出错问题

#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
struct list
{
    int *elem;
    int size;
    int maxsize;
};

bool InitList(list &l)  //初始化表
{
    l.maxsize=5;
    l.elem=new int [l.maxsize];//动态申请空间
    if(l.elem==NULL)
    {
        cout<<"无可用空间,初始化失败。\n"<<endl;
        return false;
    }
    l.size=0;
    cout<<"初始化完成,长度为"<<l.size<<"\n"<<endl;
    return true;
}

void ClearList(list &l)  //删除表
{
    if(l.size!=0)
    {
        delete []l.elem;//动态释放
        l.elem=NULL;
    }
    l.maxsize=0;
    l.size=0;
    cout<<"清除线性表完成\n"<<endl;
}

bool TraverseList(list l)  //遍历
{
    if(l.size==0)
    {
        cout<<"线性表为空"<<endl;
        return false;
    }
    for(int i=0;i<l.size;i++)
    {
        cout<<"第"<<i+1<<"个元素是"<<l.elem[i]<<endl;
    }
    return true;
}

void FindList(list l, int item)  //查询
{
     int k=0;
    for(int i=0;i<l.size;i++)
    {
        if(l.elem[i]==item)
        {
            cout<<"第"<<i+1<<"个元素满足条件"<<endl;
            k++;
        }
    }
    if(k==0)
        cout<<"线性表中没有满足条件的元素"<<endl;
    cout<<"线性表中有"<<k<<"个满足条件的元素"<<endl;
 }

bool InsertList(list &l,int item,int pos)  //插入
{
    int k=0;
    if(pos>l.size)
    {
        cout<<"pos值越界"<<endl;
        return false;
    }
    if(l.size==l.maxsize)
    {
        k=sizeof(int);
        l.elem=(int*)realloc(l.elem,(l.maxsize+5)*k);
        l.maxsize+=5;
    }
    if(pos==l.size)
    {
        l.elem[pos]=item;
        l.size++;
        cout<<"插入成功"<<endl;
        return true;
    }
    for(int i=l.size-1;i>=pos-1;i--)
    {
        l.elem[i+1]=l.elem[i];
    }
    l.elem[pos]=item;
    cout<<"插入成功"<<endl;
    l.size++;
    return true;
}

void Jc(list &l)
    {
        if((l.maxsize-l.size)>5&&(l.maxsize>10))
        {
            int k=sizeof(int);
            l.elem=(int*)realloc(l.elem,(l.maxsize-5)*k);
            l.maxsize-=5;
        }
    }

bool DeleteList(list &l,int pos) //删除
{
    if(pos>l.size)
    {
        cout<<"pos越界"<<endl;
        return false;
    }
    if(pos==l.size)
    {
        l.size--;
        cout<<"删除完成"<<endl;
        Jc(l);
        return true;
    }
    for(int i=pos;i<=l.size;i++)
    {
        l.elem[i]=l.elem[i+1];
    }
    l.size--;
    cout<<"删除完成"<<endl;
    Jc(l);
    return true;
}

void SortList(list &l) //又小到大排序
{
    int k=0;
    for(int i=1;i<l.size;i++)
    {
        k=l.elem[i];
        for(int j=i-1;j>=0;j--)
        {
            if(l.elem[j]>k)
            {
                l.elem[j+1]=l.elem[j];
                l.elem[j]=k;
            }
        }
    }
    cout<<"排序完成"<<endl;
}

void main()
{
    list lis;
    int a,b,c;
    InitList(lis);
    for(int i=0;i<lis.maxsize;i++)
    {
        cout<<"请输入要插入到"<<i+1<<"的元素:";
        cin>>a;
        InsertList(lis,a,i);
    }
    TraverseList(lis);
    cin>>b;
    FindList(lis,b);
    cin>>c;
    DeleteList(lis,c);
    TraverseList(lis);
    SortList(lis);
    TraverseList(lis);
    ClearList(lis);//在这清楚表 但是每次到这步都会弹出错误 编译的没有错误提示
    getch();
}


上面是源代码 在运行到ClearList(lis)这步的时候就会出错 请大家帮帮忙 我不知道是不是我电脑的问题 谢谢

回复列表 (共5个回复)

沙发

把DeleteList中的
for(int i=pos;i<=l.size;i++)
改为for(int i=pos; i<l.size; i++)即可
因为l.elem[5]没有初始化,没有这个数据

板凳

试过了  还是不行 
是否因为DeleteList函数删除元素引起的Delete[]p无效?

3 楼

l.elem=new int [l.maxsize];//动态申请空间

怎么没有初始化了?

4 楼

应该改为是以下:
bool DeleteList(list &l,int pos) //删除
{
    if(pos>l.size)
    {
        cout<<"pos越界"<<endl;
        return false;
    }
    if(pos==l.size)
    {
        l.size--;
        cout<<"删除完成"<<endl;
        Jc(l);
        return true;
    }
    for(int i=pos;i<=l.size;i++)
    {
        l.elem[i -1]=l.elem[i];
    }
    l.size--;
    cout<<"删除完成"<<endl;
    Jc(l);
    return true;
}

5 楼

bool InitList(list &l)  //初始化表
{
    l.maxsize=5;
    l.elem=new int [l.maxsize];//动态申请空间
    if(l.elem==NULL)
    {
        cout<<"无可用空间,初始化失败。\n"<<endl;
        return false;
    }
    l.size=0;
    cout<<"初始化完成,长度为"<<l.size<<"\n"<<endl;
    return true;
}

void ClearList(list &l)  //删除表
{
    if(l.size!=0)
    {
        delete []l.elem;//动态释放
        l.elem=NULL;
    }
    l.maxsize=0;
    l.size=0;
    cout<<"清除线性表完成\n"<<endl;
}
/////////////////////////
只是看了你前面的,发现你怎么申请了内存,l.size =0  
在删除表的时候,又去根据l.size去判断是否动态释放.
如果象下面

InitList(list &l) ;
ClearList(list &l);
//将会怎么样->内存泄露

我来回复

您尚未登录,请登录后再回复。点此登录或注册