递归函数中new的内存怎么释放?

KimTian.HPU 2017-02-14 03:59:43
求矩阵逆的时候,采用的是代数余子式的算法,需要每一阶都有各自的矩阵,因此每递归一个new出来一个小一阶的矩阵。
各位不必分析算法的优缺点,只针对C++语法,该怎么释放

//按第一行展开计算|A|
//matrix为所求矩阵,n阶
double getA(double **matrix,int n)
{
if(n==1)
{
return matrix[0][0];
}
int i,j,k;
double ans = 0;
double **temp;//余子式
temp = new double*[n]
for(i=0;i<n;i++)
temp[i] = new double[n];

for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
for(k=0;k<n-1;k++)
{
temp[j][k] = matrix[j+1][(k>=i)?k+1:k];
}
}
double t = getA(temp,n-1);
if(i%2==0)
{
ans += matrix[0][i]*t;
}
else
{
ans -= matrix[0][i]*t;
}
}
return ans;
}
...全文
880 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-02-18
  • 打赏
  • 举报
回复
仅供参考: 十字链表交换任意两个节点C源代码(C指针应用终极挑战)http://download.csdn.net/detail/zhao4zhong1/5532495
galiniur0u 2017-02-17
  • 打赏
  • 举报
回复
引用 10 楼 u014570007 的回复:
[quote=引用 8 楼 yshuise 的回复:] }
大哥,这样是不行的。。。。[/quote] 不知道楼主为什么认为8楼那个不行?
KimTian.HPU 2017-02-17
  • 打赏
  • 举报
回复
引用 12 楼 wangjiantaoafeier 的回复:
如果递归层次较深建议把所有分配好的内存管理起来,最后统一处理内存
怎么管理?
wangafei1988 2017-02-17
  • 打赏
  • 举报
回复
引用 13 楼 u014570007 的回复:
[quote=引用 12 楼 wangjiantaoafeier 的回复:] 如果递归层次较深建议把所有分配好的内存管理起来,最后统一处理内存
怎么管理?[/quote] 用一个vector<double*> 来保存
张小飞Official 2017-02-17
  • 打赏
  • 举报
回复
引用 15 楼 xiaohuh421 的回复:
我看你的函数中new了temp, 没有传递出去, 仅是在函数内部使用. 那么在函数return前delete释放即可, 智能指针的, 真的不需要, 也不适合这种场合.
智能指针确实没用,在理
xiaohuh421 2017-02-17
  • 打赏
  • 举报
回复
我看你的函数中new了temp, 没有传递出去, 仅是在函数内部使用. 那么在函数return前delete释放即可, 智能指针的, 真的不需要, 也不适合这种场合.
wangafei1988 2017-02-16
  • 打赏
  • 举报
回复
如果递归层次较深建议把所有分配好的内存管理起来,最后统一处理内存
xskxzr 2017-02-15
  • 打赏
  • 举报
回复
引用 4 楼 hoya5121 的回复:
为何不用智能指针auto_ptr 递归时new的内存不会造成堆溢出,因为是分配在堆上,直接定义的变量占用内存过大时通常会栈溢出
auto_ptr在C++11后是deprecated,在C++17后正式移除。 http://en.cppreference.com/w/cpp/memory/auto_ptr
hoya5121 2017-02-15
  • 打赏
  • 举报
回复
为何不用智能指针auto_ptr 递归时new的内存不会造成堆溢出,因为是分配在堆上,直接定义的变量占用内存过大时通常会栈溢出
ztenv 版主 2017-02-15
  • 打赏
  • 举报
回复
有一个叫“智能指针”的东东
真相重于对错 2017-02-15
  • 打赏
  • 举报
回复
引用 10 楼 u014570007 的回复:
[quote=引用 8 楼 yshuise 的回复:] }
大哥,这样是不行的。。。。[/quote] 一样的,只要保证,在new 和 delete 之间不return
KimTian.HPU 2017-02-15
  • 打赏
  • 举报
回复
引用 8 楼 yshuise 的回复:
}
大哥,这样是不行的。。。。
ztenv 版主 2017-02-15
  • 打赏
  • 举报
回复
引用 7 楼 u014570007 的回复:
[quote=引用 2 楼 lianshaohua 的回复:] 有一个叫“智能指针”的东东
多谢!递归函数中动态内存,只有智能指针可以解决释放的问题,是吗?[/quote] 不是,有很多种方法可以解决。
yshuise 2017-02-15
  • 打赏
  • 举报
回复
double getA(double **matrix,int n) { if(n==1) { return matrix[0][0]; } int i,j,k; double ans = 0; double **temp;//余子式 temp = new double*[n] for(i=0;i<n;i++) temp[i] = new double[n]; for(i=0;i<n;i++) { for(j=0;j<n-1;j++) { for(k=0;k<n-1;k++) { temp[j][k] = matrix[j+1][(k>=i)?k+1:k]; } } double t = getA(temp,n-1); if(i%2==0) { ans += matrix[0][i]*t; } else { ans -= matrix[0][i]*t; } } for(i=0;i<n;i++) delete[] temp[i]; delete [] temp; return ans; }
KimTian.HPU 2017-02-15
  • 打赏
  • 举报
回复
引用 2 楼 lianshaohua 的回复:
有一个叫“智能指针”的东东
多谢!递归函数中动态内存,只有智能指针可以解决释放的问题,是吗?
KimTian.HPU 2017-02-15
  • 打赏
  • 举报
回复
引用 4 楼 hoya5121 的回复:
为何不用智能指针auto_ptr 递归时new的内存不会造成堆溢出,因为是分配在堆上,直接定义的变量占用内存过大时通常会栈溢出
递归函数只有智能指针可以解决释放动态内存的问题?
  • 打赏
  • 举报
回复
return前释放就可以了。

64,654

社区成员

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

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