| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3833 人关注过本帖
标题:子函数开辟的内存空间如何释放?
只看楼主 加入收藏
许一民
Rank: 1
来 自:江苏连云港
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-9-29
收藏
 问题点数:0 回复次数:6 
子函数开辟的内存空间如何释放?
#include <stdio.h>
#include <stdlib.h>

double *mat_mul(double A[],double B[],int I,int K,int J)
{
    int i,j,k;double *mat_mul_return;

    mat_mul_return=calloc( I*J , sizeof(double) );

    for(i=0;i<I;i++)
        for(j=0;j<J;j++)
            for(k=0;k<K;k++)
                mat_mul_return[i*J+j] += A[i*K+k]*B[k*J+j];
            
    printf("Subfunction output:\n");
    for(i=0;i<I;i++)
        for(j=0;j<J;j++)
        {
            printf("%12g",mat_mul_return[i*J+j]);
            if(j==J-1)
                printf("\n");
        }
    printf("End output!\n");

    return mat_mul_return;
}

int main()
{
    int i,j;
    double A[]={4,5,3,4},B[]={1,6,3,7},*p,C[4];

    p=mat_mul(A,B,2,2,2);

    for(i=0;i<4;i++)
         C[i]=p[i];

    printf("\nMatrix A:\n");
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
        {
            printf("%12g",A[i*2+j]);
            if(j==1)
                printf("\n");
        }

    printf("\nMatrix B:\n");
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
        {
            printf("%12g",B[i*2+j]);
            if(j==1)
                printf("\n");
        }

    printf("\nMultiply matrix A*B:\n");
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
        {
            printf("%12g",C[i*2+j]);
            if(j==1)
                printf("\n");
        }
   
    return 0;
}

  上例为DFP算法中计算矩阵的一个子函数mat_mul,用calloc开辟了内存空间,但由于需要返回函数值不能立即释放,问题是:在子函数完成了预期功能,在传递函数值后如何释放mat_mul开辟的内存空间?
  此外,还有一个引申出的问题:若需要在返回时同时返回结果矩阵的行数、列数及元素个数(必须是整型),应该如何实现。
  如使用结构体,则必须保证其通用性:也即它应使用于一般的矩阵A[I*K]与B[K*J](I、J、K都在允许范围内)相乘的应用。举例而言,如3*2的矩阵与2*4的矩阵相乘,由于结果是3*4的矩阵(14个元素),此结构体就应是12个双精度型后接3个整型数(C的行数——3,C的列数——4,C包含的元素个数——12)。
  如采用calloc、malloc等函数,则必须保证内存在应用结束后得到释放(应需要反复迭代),函数应也能同时返回双精度的元素值和行列信息。
  由于使用全局变量会给函数模块带来不利影响,暂不考虑。
搜索更多相关主题的帖子: 内存 mat 函数 mul double 
2007-12-16 21:57
许一民
Rank: 1
来 自:江苏连云港
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-9-29
收藏
得分:0 
  在主函数p=mat_mul(A,B,2,2,2);后加上
  free(p);
  可以吗?

  呵呵,是不是在调用子函数之后释放指针就可以了?还望各位大侠不吝赐教!

  
2007-12-16 22:25
许一民
Rank: 1
来 自:江苏连云港
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-9-29
收藏
得分:0 
  刚刚验证过,可以采取这种方法。
2007-12-17 07:36
無邪的睡脸
Rank: 2
等 级:等待验证会员
威 望:1
帖 子:344
专家分:13
注 册:2007-9-11
收藏
得分:0 
子函数开辟的内存空间,在子函数调用完后自动释放,不需要任何操作!
2007-12-17 08:24
许一民
Rank: 1
来 自:江苏连云港
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-9-29
收藏
得分:0 
  楼上的可能误会了,如果是常规的子函数您的说法没错,但在这个特例中并非如此。
  本文中的子函数采用<stdlib>中的calloc专门开辟了内存空间,并不会在调用之后立即释放。若您在主函数int main的    for(i=0;i<4;i++) C[i]=p[i];语句后面加入    
for(i=0;i<4;i++)   printf("%10g",p[i]);
你会发现此程序段的运行结果为        19        59        15        46,显然*p所指向的内存空间并未得到释放。
若在刚才的语句前加上free(p);空间释放后,若在VC6下运行,程序段结果变成了-1.45682e+144-1.45682e+144-1.45682e+144-1.45682e+144.
  在大型程序中,由于需要进行反复迭代,若不需要的空间得不到及时释放,内存被占满只是一个时间问题,我可是深有体会

[[italic] 本帖最后由 许一民 于 2007-12-17 11:41 编辑 [/italic]]
2007-12-17 11:39
無邪的睡脸
Rank: 2
等 级:等待验证会员
威 望:1
帖 子:344
专家分:13
注 册:2007-9-11
收藏
得分:0 
不好意思!我没看例子!
2007-12-17 11:48
许一民
Rank: 1
来 自:江苏连云港
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-9-29
收藏
得分:0 
呵呵,没关系的,还是谢谢您的帮助!
2007-12-17 11:51
快速回复:子函数开辟的内存空间如何释放?
数据加载中...
 
   



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

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