2016-07-12 11 views
0

php7コードの参照カウントはどうなりますか? PHP7 zval秒で はスタック上に作成されているので、参照の問題が発生:php7 zend拡張子:スタック変数のrefcount?

zval destination; 
array_init(destination); 

{ 
    // scope begin 

    zval val; 

    // does val's refcount incremented here or val is copied? 
    add_next_index_zval(destination, val); 

    // here the "val" will be destroyed. 
    // Does "destination" will experience any problems? 
} 
+1

具体的なコードがなくても難しいとは言い難いですが、一般的にこれは問題ありません。 'val'の値は配列にコピーされるので、' val'変数がスコープから外れても問題はありません。 – NikiC

答えて

0

私はそれがコピーされると信じています。ここでzvalを使用してカスタムクラスインスタンスを保持する場合は、このコードをコンパイルするためのクラスのコピーコンストラクタが必要です。

PHPではC言語ではなく、プログラムで自動RCが実行されると思います。このレベルの参照を利用するには、ポインタを使用する必要があります。

PHP拡張機能の作成についてさらに詳しく調べると、実際にZend EngineはRCと元の(目的)zvalをPHPに戻す際にどのようにしたいかを尋ねます(2番目と3番目パラメータはRETURN_ZVAL())。注意深く扱わないと、メモリリークが発生する可能性があります(デバッグモードではZEがこれを伝えます)。

0

PHP 7では、zvalは参照されず、その値のみが参照されます。

zvalにrefcounted型(null、boolean、integer、float)が含まれている場合、PHPは単にzvalをコピーします。

zvalにrefcounted型(文字列、配列、オブジェクト、リソース、および参照)が含まれている場合、PHPはzvalをコピーし、zvalが指す値(たとえばzend_stringまたはzend_array)の参照カウントをインクリメントします。 zval自体にはrefcountはありません。

関連する問題