Расширение Zend php7: refcount для переменной стека?

Что произойдет с подсчетом ссылок в следующем коде c для php7? В php7 zval создаются в стеке, поэтому возникают проблемы со ссылками:

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?
}

person pavelkolodin    schedule 12.07.2016    source источник
comment
Трудно сказать без более конкретного кода, но в целом это нормально. Значение val копируется в массив, поэтому если переменная val выходит за пределы области видимости, это не имеет значения.   -  person NikiC    schedule 14.07.2016


Ответы (2)


Я считаю, что это скопировано. Если вы используете здесь zval для хранения пользовательского экземпляра класса, вам понадобится конструктор копирования для вашего класса, чтобы скомпилировать этот код.

Я думаю, что автоматический RC происходит, когда вы программируете на PHP, а не на C. Вы должны использовать указатели, чтобы воспользоваться ссылкой на этом уровне.

И если вы изучите больше о написании расширений PHP, вы обнаружите, что на самом деле Zend Engine спрашивает вас, как вы хотели бы поступить с RC и исходным (объективным) zval, возвращая его обратно в PHP (второй и третий параметр RETURN_ZVAL()) . Если не обращаться с ними внимательно, может быть утечка памяти (в режиме отладки ZE скажет вам об этом!) или даже segfault.

person Frederick Zhang    schedule 06.10.2016

В PHP 7 на zval не ссылаются, только на их значения.

Если zval содержит тип без подсчета ссылок (null, логические значения, целые числа, числа с плавающей запятой), тогда PHP просто скопирует zval.

Если zval содержит тип с подсчетом ссылок (строки, массивы, объекты, ресурсы и ссылки), тогда PHP скопирует zval и увеличит счетчик ссылок значения (например, zend_string или zend_array), на которое указывает zval. Сам zval не имеет счетчика ссылок.

person Andrea    schedule 29.10.2016