关于对象销毁

bigman

to dear walkor:

    $obj = new $class();

    //记录到对象池
    Gdate::$objPool = &$obj;

如上 我会把所有new过的对象都放入一个对象池里面,当一个请求结束后 我需要 手动销毁所有对象
请问这个要怎么弄,直接 unset ?还是设值为null?试了下 unset掉 Gdate::$objPool 原本的 对象还存在 zend会拷贝一份,设置为null是可以的,但不知道是不是标准做法

2433 7 0
7个回答

walkor

试了下 unset掉 Gdate::$objPool 原本的 对象还存在 zend会拷贝一份

是怎么看出来的呢?

一般unset()就可以了,另外对象不用传引用的,对象本身就是类似一种引用的机制。

  • 暂无评论
bigman

你是说 当 php new一个对象的时候 是对该内存块重新构造初始化了一下吗? 不过我试了下 当请求不停过来 不停的new的时候 是越来越多的对象

  • 暂无评论
bigman
$aa = new \stdClass();
$aa->test1 = 123;
$aa->test2 = 456;
self::$tmp = &$aa;

$bb = new \stdClass();
$bb->t1 = "ssss";
$bb->t2 = "ooooo";

self::$tmp = &$bb;
$bb->t3 = "ppppppppppppp";

var_dump(self::$tmp);

foreach (self::$tmp as $key => $o) {
    unset(self::$tmp);
    //self::$tmp = null;
}
var_dump(self::$tmp);
echo "*************_**__**_{$bb->t2}**************";

我是这样测试的

  • 暂无评论
walkor

根据php gc机制,如果没有任何变量引用这个对象,对象就自动释放了。
因为$bb变量还引用着对象,所以$bb变量是可以访问到对象的。
如果再unset($bb);或者离开变量作用域那么就都会释放了。

直接设置 self::$tmp = null; 虽然可以释放,但是self::$tmp里面仍然有多个null元素,不unset掉的话会有内存泄漏

  • 暂无评论
bigman

那 如果 是 在 onMessage回调里面多次new了对象的话 应该是不需要手动去释放的把?

  • 暂无评论
walkor

函数里临时变量不需要手动unset,临时变量都会自动gc的。
全局变量或者静态变量需要手动unset

  • 暂无评论
bigman

ok

  • 暂无评论
年代过于久远,无法发表回答
🔝