2015-02-09 1 views
0

Я создаю класс 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-расширения, используя некоторые другие методы/макросы?

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

ответ

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^