我需要让我的 PHP 扩展返回一个对象数组,但我似乎无法弄清楚如何做到这一点。
我有一个Graph用 C++ 编写的对象。Graph.getNodes()返回一个std::map<int, Node*>。这是我目前的代码:
结构节点对象{
zend_object 标准;
节点*节点;
};
zend_class_entry *node_ce;
然后
PHP_METHOD(图形,getNodes)
{
图*图;
GET_GRAPH(graph, obj) // 我编写的用于填充图形的宏
节点对象* n;
zval* node_zval;
如果(obj == NULL){
RETURN_NULL();
}
如果(object_init_ex(node_zval,node_ce)!=成功){
RETURN_NULL();
}
std::map 节点 = 图->getNodes();
array_init(return_value);
for (std::map::iterator i = nodes.begin(); i != nodes.end(); ++i) {
php_printf("X");
n = (node_object*) zend_object_store_get_object(node_zval TSRMLS_CC);
n->节点= i->秒;
add_index_zval(return_value, i->first, node_zval);
}
php_printf("]");
}
当我运行时,php -r '$g = new Graph(); $g->getNodes();'我得到输出
XX]Segmentation fault
这意味着 getNodes() 函数成功循环通过我的 2 节点列表,返回,然后是段错误。我究竟做错了什么?