免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7371 | 回复: 14
打印 上一主题 下一主题

[求助]如何释放一个内部带引用的数组内存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-30 10:44 |只看该作者 |倒序浏览
由于要用php以shell方式处理一些数据,我以引用的方式建立了一个数组
由于每次调用某个函数都需要生成这个数组

数组的生成过程可能是:
$root = array();
$p = array()
$a =& $root;
$b =& $root;

$b = array( 1,3,4 );

$b[1] =& $p;
$p = array( 3, 4,6);
return $root;

最后一条return $root;
返回这个数组给其它函数用了

这里使用了引用方式建立了一个比较大的数组,加上重复调用这个函数,导致内存越来越大,最后无法运行,简单是unset 或者 赋值于NULL,均无效,请问有比较什么办法释放内存呢?

[ 本帖最后由 zhuomingliang 于 2008-1-30 12:30 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-30 11:01 |只看该作者
$p = array(3, 4, 6);
$root = array(1, &$p, 4);
$a = &$root;
$b = &$root;
return $root;

你原来的写法浪费了两个空数组和一个变量结构

论坛徽章:
0
3 [报告]
发表于 2008-01-30 11:08 |只看该作者
如果你在函数中建立并返回的数组可能在外部被修改,
应该在函数定义的语法上标明返回引用,
否则,如果是只读的,
可以不用返回引用,因为zend会把它优化为 写复制引用(copy-on-write referencing),
既“临时”引用,只在修改时候copy一份。

[ 本帖最后由 hshq_cn 于 2008-1-30 11:09 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-01-30 11:49 |只看该作者
原帖由 hshq_cn 于 2008-1-30 11:01 发表
$p = array(3, 4, 6);
$root = array(1, &$p, 4);
$a = &$root;
$b = &$root;
return $root;

你原来的写法浪费了两个空数组和一个变量结构



谢谢,但是请不要关注我这个代码,这个仅仅是模拟的,实际上我不是这样写的(相差太远了)

里面的问题是如何释放数组的内存(这个数组被多个函数调用和解析)。

[ 本帖最后由 zhuomingliang 于 2008-1-30 12:31 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-01-30 14:46 |只看该作者
不使用引用,把数组放到类中反复利用,或干脆直接使用全局变量。这样变量只需要声明一次。

论坛徽章:
0
6 [报告]
发表于 2008-01-30 16:53 |只看该作者
原帖由 sunnyfun 于 2008-1-30 14:46 发表
不使用引用,把数组放到类中反复利用,或干脆直接使用全局变量。这样变量只需要声明一次。

话虽如此,这个数组不是简单的数组,这个数组也仅用一次的,但是这个数组的复杂度比较高,在这一次使用里面,就多次遍历,当然不是简单的遍历一下。

怎么回帖的都是让我回避问题,而不是解决问题啊。

[ 本帖最后由 zhuomingliang 于 2008-1-30 16:54 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-01-30 18:01 |只看该作者
这是你调用摸某个函数生成的东西,这些临时变量应该在函数返回的时候就释放掉内存了
$a   = bbs();//比如产生10m内存
unset($a);  //应该在这里释放吧.
不知道你是怎么处理的。

论坛徽章:
0
8 [报告]
发表于 2008-01-30 20:21 |只看该作者
原帖由 sunceenjoy 于 2008-1-30 18:01 发表
这是你调用摸某个函数生成的东西,这些临时变量应该在函数返回的时候就释放掉内存了
$a   = bbs();//比如产生10m内存
unset($a);  //应该在这里释放吧.
不知道你是怎么处理的。


是的,如果 $a 是全局变量,而且没有其他函数对$a的调用和深度解析

是可以释放内存给下一个$a 使用。

论坛徽章:
0
9 [报告]
发表于 2008-01-31 09:10 |只看该作者
原帖由 zhuomingliang 于 2008-1-30 16:53 发表

话虽如此,这个数组不是简单的数组,这个数组也仅用一次的,但是这个数组的复杂度比较高,在这一次使用里面,就多次遍历,当然不是简单的遍历一下。

怎么回帖的都是让我回避问题,而不是解决问题啊。


拜托先学一下unset的使用规则好吗:

如果在函数中 unset() 一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。


手册原话。意思是你原来unset的不是地方。

如果知道那些东西内存放不下的话可以借助外部文件甚至数据库的力量。

[ 本帖最后由 sunnyfun 于 2008-1-31 09:17 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-01-31 10:53 |只看该作者
原帖由 zhuomingliang 于 2008-1-30 16:53 发表

话虽如此,这个数组不是简单的数组,这个数组也仅用一次的,但是这个数组的复杂度比较高,在这一次使用里面,就多次遍历,当然不是简单的遍历一下。

怎么回帖的都是让我回避问题,而不是解决问题啊。

那你自己解决问题啊,别人又没义务给你解决问题!

[ 本帖最后由 lgmyxbjfu 于 2008-1-31 10:55 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP