PHP 拡張機能でオブジェクトの配列を返す必要がありますが、これを行う方法がわかりません。
GraphC++ で記述されたオブジェクトがあります。Graph.getNodes()を返しますstd::map<int, Node*>。これが私が現在持っているコードです:
struct node_object {
zend_object std;
ノード *ノード;
};
zend_class_entry *node_ce;
それから
PHP_METHOD(グラフ、getNodes)
{
グラフ *グラフ;
GET_GRAPH(graph, obj) // グラフを作成するために作成したマクロ
node_object* n;
zval* node_zval;
if (obj == NULL) {
RETURN_NULL();
}
if (object_init_ex(node_zval, node_ce) != 成功) {
RETURN_NULL();
}
std::map nodes = graph->getNodes();
array_init(戻り値);
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->node = i->second;
add_index_zval(return_value, i->first, node_zval);
}
php_printf("]");
}
実行するphp -r '$g = new Graph(); $g->getNodes();'と、出力が得られます
XX]Segmentation fault
つまり、getNodes() 関数は 2 つのノード リストを正常にループし、リターンしてから segfaults を返します。私は何を間違っていますか?