子函数开辟的内存空间如何释放?
#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等函数,则必须保证内存在应用结束后得到释放(应需要反复迭代),函数应也能同时返回双精度的元素值和行列信息。
由于使用全局变量会给函数模块带来不利影响,暂不考虑。
----------------解决方案--------------------------------------------------------
在主函数p=mat_mul(A,B,2,2,2);后加上
free(p);
可以吗?
呵呵,是不是在调用子函数之后释放指针就可以了?还望各位大侠不吝赐教!
----------------解决方案--------------------------------------------------------
刚刚验证过,可以采取这种方法。
----------------解决方案--------------------------------------------------------
子函数开辟的内存空间,在子函数调用完后自动释放,不需要任何操作!
----------------解决方案--------------------------------------------------------
楼上的可能误会了,如果是常规的子函数您的说法没错,但在这个特例中并非如此。
本文中的子函数采用<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]]
----------------解决方案--------------------------------------------------------
不好意思!我没看例子!
----------------解决方案--------------------------------------------------------
呵呵,没关系的,还是谢谢您的帮助!
----------------解决方案--------------------------------------------------------