gpt4 book ai didi

c++ - PHP 扩展 - 使用 std::string 的全局类

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:11 26 4
gpt4 key购买 nike

我正在学习如何编写 PHP 扩展,遇到了一个我无法在 Interwebs 上找到答案的问题。我正在尝试使用我的 PHP 扩展中的 C++ 类,虽然它似乎在 CLI 中工作,但 valgrind 报告了问题。

我的全局变量如下:

ZEND_BEGIN_MODULE_GLOBALS(myext)
MyClass *myClass;
ZEND_END_MODULE_GLOBALS(myext)

此类被实例化为全局扩展如下:

static void myext_init_globals(zend_myext_globals *myext_globals TSRMLS_DC)
{
myext_globals->myClass = (MyClass*)pemalloc(sizeof(MyClass), 0);
MyClass *myClass = new (myext_globals->myClass) MyClass();
}

它是通过以下方式释放的:

static void myext_destroy_globals(zend_myext_globals *myext_globals TSRMLS_DC)
{
pefree(myext_globals->myClass, 0);
}

我的类.h:

class MyClass
{
private:
std::string strSomeText;

public:
MyClass();
~MyClass();
};

我的类.cpp:

MyClass::MyClass()
{
strSomeText = "ABC"; // <-- this causes valgrind errors!
}

我发现,如果我可以将 strSomeText 设为静态成员变量,则 valgrind 不会报告任何错误。

此外,如果我尝试在 MyClass 构造函数中分配内存,然后在 MyClass 析构函数中删除或释放它,valgrind 会再次报告泄漏。

理想情况下,我希望能够获取“任何 ol' 类”并直接使用它而不必对其进行重大更改以使其作为 PHP 全局扩展工作。

更新:我的问题是,如何使用“通用”C++ 类,它使用 std::string 之类的东西,或者分配/取消分配内存(在构造函数/析构函数或成员方法中)?我发现,如果我在 MyClass 中包含 php.h,然后使用 emalloc/pemalloc 分配内存,然后使用 efree 和 pefree 取消分配内存,那么一切正常,并且 valgrind 没有报告内存泄漏。然而,这并不理想。必须有一种方法可以使用“通用”C++ 类(即您不必重构为 PHP 扩展友好的类)作为全局 PHP 扩展(如我上面的示例)。

最佳答案

为什么要使用 pemalloc/pefree?我不知道如何调用 myClass 的析构函数?在没有 ZEND_END_MODULE_GLOBALS 的情况下试试这个:

std::unique_ptr<MyClass> myClass;


PHP_MINIT_FUNCTION(myext)
{
myClass = std::unique_ptr<MyClass> (new MyClass);
}

PHP_MSHUTDOWN_FUNCTION(myext)
{
myClass.reset();
}

在 PHP 模块中使用 C++ 真的很棘手。如果发生错误或 HTTP 请求中断,PHP 函数调用永远不会返回。这打破了异常和析构函数调用。所以最好将 C++ 代码与 PHP 函数调用完全分开。保证在模块启动和退出时调用 PHP_MINIT_FUNCTION 和 PHP_MSHUTDOWN_FUNCTION。但是,作为 Apache 模块的 PHP 可以创建该模块的一个虚拟版本,然后才能创建真实版本。 PHP_MINIT_FUNCTION 和 PHP_MSHUTDOWN_FUNCTION 也被称为虚拟版本,所以你应该避免在这里分配巨大的对象和/或做大量磁盘读/写等的事情。

关于c++ - PHP 扩展 - 使用 std::string 的全局类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28571347/

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