swoole / phpx

💗 C++ wrapper for Zend API

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Variant作为函数返回值

owenliang opened this issue · comments

以Object的get方法为例:

 inline Variant get(const char *name)
    {
        Variant retval;
        zval rv;
        zval *member_p = zend_read_property(Z_OBJCE_P(ptr()), ptr(), name, strlen(name), 0, &rv);
        if (member_p != &rv)
        {
            ZVAL_COPY(retval.ptr(), member_p);
        }
        else
        {
            ZVAL_COPY_VALUE(retval.ptr(), member_p);
        }
        return retval;
    }

我这样接收返回值:

Variant a = _this.get("domain");

按照我的理解,a会浅复制get的返回值Variant,然后返回值Varient析构和a析构会对zval形成2次释放。

但是实际上并没有发生double free,求分析一下。