2015-02-09 73 views
0

我正在實例化一個C++類作爲PHP擴展中的全局。它的工作原理,然而,valgrind正在報告一個明確的內存泄漏。如何在PHP擴展中實例化一個全局C++類?

在我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) 

如果我使用「new」刪除實例化MyClass的部件,則不存在內存泄漏。這導致我相信C++類需要使用其他方法/宏在PHP擴展中實例化?

任何幫助,揭示這一點真的很感激。

回答

1

要關閉此功能。問題是因爲MyClass有一個私有靜態成員變量沒有在實現文件中聲明。上述工作在PHP擴展中實例化一個全局類,儘管它並不總是被實例化(來來去去)。將另存爲另一個問題:)