gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:26:36 25 4
gpt4 key购买 nike

我正在将 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;
}

我已经使用以下方法向 PHP 公开了 MyClass::test() 方法:

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 扩展中实例化?

任何能阐明这一点的帮助都将不胜感激。

最佳答案

要关闭这个。问题是因为 MyClass 有一个未在实现文件中声明的私有(private)静态成员变量。以上适用于在 PHP 扩展中实例化全局类,尽管它并不总是实例化(来来去去)。将把它留到另一个问题:)

关于c++ - 如何在 PHP 扩展中实例化全局 C++ 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28416035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com