утечки памяти — Как создать глобальный класс C ++ в расширении PHP?

Я создаю экземпляр класса C ++ как глобального внутри расширения PHP. Это работает, однако, valgrind сообщает об определенной утечке памяти.

В моем 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, используя следующее:

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

Все отлично работает из моего скрипта PHP:

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

Однако, когда я проверяю свой тестовый скрипт (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, используя «new», утечки памяти не происходит. Это наводит меня на мысль, что классы C ++ нужно создавать внутри расширения PHP с использованием какого-либо другого метода / макроса?

Любая помощь, которая проливает свет на это, будет очень признательна.

0

Решение

Собираюсь закрыть это. Проблема заключалась в том, что MyClass имеет закрытую статическую переменную-член, которая не была объявлена ​​в файле реализации. Вышеприведенное работает для создания экземпляра глобального класса в расширении PHP, хотя это не всегда создается (вид приходит и уходит). Сохраню это для другого вопроса 🙂

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector