如何在PHP扩展中实例化全局C ++类?

时间:2015-02-09 17:47:37

标签: c++ memory-leaks valgrind php-extension

我将一个C ++类实例化为PHP扩展中的全局。但是,valgrind报告了一个确定的内存泄漏。

在我的php_myext.h中,我使用:

声明全局
 ZEND_BEGIN_MODULE_GLOBALS(myext)
  MyClass *myClass;
 ZEND_END_MODULE_GLOBALS(myext)

在我的PHP_MINIT_FUNCTION中,我为globals设置了初始化器和析构函数:

ZEND_INIT_MODULE_GLOBALS(myext, myext_init_globals, myext_destroy_globals);

然后我的初始化器和析构函数实现如下:

// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
static void myext_init_globals(zend_myext_globals *myext_globals)
{
  myext_globals->myClass = new MyClass();
}

// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
static void myext_destroy_globals(zend_myext_globals *myext_globals)
{
  delete myext_globals->myClass;
}

我使用以下内容将MyClass :: test()方法暴露给PHP:

static PHP_METHOD(MyExt, test)
{
  RETURN_STRING(MYEXT_G(myClass)->test().c_str(), 1);
}

我的PHP脚本一切正常:

<?php echo MyExt::test(); ?>

然而,当我对我的测试脚本(test.php)进行valgrind时,我得到了泄漏:

LEAK SUMMARY:
    definitely lost: 8 bytes in 1 blocks
    indirectly lost: 42 bytes in 1 blocks
      possibly lost: 0 bytes in 0 blocks
    still reachable: 2,256 bytes in 18 blocks
         suppressed: 0 bytes in 0 blocks
 Reachable blocks (those to which a pointer was found) are not shown.
 To see them, rerun with: --leak-check=full --show-reachable=yes

 For counts of detected and suppressed errors, rerun with: -v
 ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 282 from 9)

如果我删除使用“new”实例化MyClass的部分,则没有内存泄漏。这让我相信C ++类需要使用其他方法/宏在PHP扩展中实例化?

任何能够揭示这一点的帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

要关闭它。问题是因为MyClass有一个私有的静态成员变量,它没有在实现文件中声明。以上工作用于在PHP扩展中实例化全局类,尽管它并不总是被实例化(来来去去)。将其保存为另一个问题:)