Я создаю класс C++ как глобальный внутри расширения PHP. Это работает, однако, valgrind сообщает об определенной утечке памяти.Как создать экземпляр глобального класса C++ в PHP-расширении?
В моей php_myext.h, я объявляю глобальный помощью:
ZEND_BEGIN_MODULE_GLOBALS(myext)
MyClass *myClass;
ZEND_END_MODULE_GLOBALS(myext)
Внутри моей PHP_MINIT_FUNCTION я поставил инициализатору и деструктор глобалов:
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 u петь следующее:
static PHP_METHOD(MyExt, test)
{
RETURN_STRING(MYEXT_G(myClass)->test().c_str(), 1);
}
Все работает отлично от моего PHP скрипта:
<?php echo MyExt::test(); ?>
Однако, когда я VALGRIND моего тестового сценария (test.php), я получаю утечку:
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)
Если я удалю части, которые создают MyClass, используя «новое», утечек памяти нет. Это заставляет меня полагать, что классы C++ необходимо создавать внутри PHP-расширения, используя некоторые другие методы/макросы?
Любая помощь, которая проливает свет на это, будет действительно оценена.