| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 389 人关注过本帖
标题:又一道题,释放空间的
只看楼主 加入收藏
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
结帖率:96.25%
收藏
已结贴  问题点数:20 回复次数:6 
又一道题,释放空间的
题目要求是,写一个可以改变一维数组size大小的函数,将原数组内里元素拷贝过去新的数组以后,释放原数组。

char a[]="abcd";
delete []a;

问题就在这个释放原数组了,new出来的还可以delete,像这种怎么释放它,还题目理解错了,两个数组全部是new出来的.

[[it] 本帖最后由 mfkblue 于 2009-7-22 18:48 编辑 [/it]]
搜索更多相关主题的帖子: 动态 
2009-07-22 18:08
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:20 
回复 楼主 mfkblue
嗯,静态声明的数组应该是不能释放的。我觉得要想实现这种转来转去的就要靠动态申请,用类实现才行。题目是只让写一个函数吗?
2009-07-22 21:11
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
收藏
得分:0 
回复 2楼 pangding
恩,我还是申请了小点数组传到函数里,然后返回一个改好size的数组回来.
#include <iostream.h>
template <class T>
T* change(T *list,int o,int n)
{
    T *t;
    t=new T[n];
    int i;
    for(i=0;i<o;i++)
        t[i]=list[i];
    delete []list;
    return t;
}

void main()
{
    int *a,i;
    a=new int[10];
    for(i=0;i<10;i++)
    a[i]=i+1;
    a=change(a,10,20);
    a[19]=5;
    cout<<a[19];
    delete []a;
}
应该就这样了

[[it] 本帖最后由 mfkblue 于 2009-7-22 21:40 编辑 [/it]]
2009-07-22 21:37
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 3楼 mfkblue
我有几个疑问:
这个所谓的改大小是一定会把原来的变大,还是说也可能不变或者变小呢?
比如这么调用合理吗?
chang(a, 20, 10);
chang(a, 10, 10);
当然第二个这种调用可能比较无聊,但第一个还是有可能的,一开始要用一个很大的数组,但之后没用了也许会有变小的需要。

另一个小提议,其实可以在函数中:
delete[] list;
之后,改成:
list = t;
函数不返回值。
或者:
return list = t;

因为要改变一个数组的大小几乎无疑会使原来数组改变位置。所以在函数中改,可以减轻很多使用者的负担~
2009-07-22 22:15
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
收藏
得分:0 
也对哦,变小时要比较形参o和n的值,小的做为循环条件。
不太明白 return list=t是怎么回事。
刚又写个二维的更恐怖。可惜在错了,有注释可以帮忙看看.
#include <iostream.h>
template <class T>
void Array(T **&x,int row,int clu) //申请新的二维数组
{
    int i;
    x=new T*[row];
    for(i=0;i<row;i++)
    x[i]=new T[clu];
    
}

template <class T>
void Del2dArray(T **&x,int row)        //释放二维数组
{
    int i;
    for(i=0;i<row;i++)
        delete []x[i];
    delete []x;
    x=0;
}

template <class T>
void change(T**&ne2,T **&old,int o,int nr,int nc)
{
    Array(ne2,nr,nc);
    int i;
    for(i=0;i<o;i++)
        ne2[i]=old[i];
    cout<<ne2[0][1];            //从这里看来新的数组的申请和赋值都是成功的
    Del2dArray(old,o);
}

void main()
{
    int **c;
    int i,j,o=1;
    Array(c,3,4);
    for(i=0;i<3;i++)
        for(j=0;j<4;j++)
            c[i][j]=o++;
    int **n;
    change(n,c,3,10,20);
    cout<<n[0][1];                //到这里就出错了
    Del2dArray(n,10);
}
2009-07-22 22:35
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
收藏
得分:0 
自己顶下,这个二维数组改变大小时,出错的地方倒是找到了,就是change函数里 Del2dArray(old,o);调用这个释放空间时出错。old也就是main函数里的c所指向的二维数组空间已经没用了,我一释放就出错。
如果不管老的二维数组,我又发现释放新数组后,老数组也没用了。这两个二维数组怎么连到一起去了.
2009-07-23 23:35
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 6楼 mfkblue
你这个不是真正的二维数组呀,真正的二维数组不是应该占用连续的内存?
不过你这样也行,灵活性好一点。
2009-07-24 00:44
快速回复:又一道题,释放空间的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034959 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved