2013-07-15 2 views
0

php 확장자로 C++ 클래스를 래핑하기 위해 tutorial을 따르고 있습니다. 나는 wamp 서버와 PHP 5.4.16을 사용하고있다.PHP 확장에서 C++ 클래스 래핑

PHP_METHOD(Car, __construct)에 문제가 발생했습니다.

car_object *obj = (car_object *) zend_object_store_get_object (object TSRMLS_CC); 

에 호출 한 후 다음 obj ->car가 유효한 주소가 아닌 것 같습니다. 줄을 obj ->car = car에 말하면 wamp가 종료되지 않습니다. 그래서 나는 obj ->car이 유효하지 않거나 합법적 인 주소라고 생각하지 않습니다.

울부 짖는 소리는 내 코드입니다 :

vehicles.cc :

#include "php.h" 
#include "car.h" 

#define PHP_VEHICLES_EXTNAME "vehicles" 
#define PHP_VEHICLES_EXTVER "0.1" 

zend_object_handlers car_object_handlers; 

struct car_object { 
    zend_object std; 
    Car *car; 
}; 


zend_class_entry *car_ce; 


void car_free_storage(void *object TSRMLS_DC) 
{ 
    car_object *obj = (car_object *)object; 
    delete obj->car; 

    zend_hash_destroy(obj->std.properties); 
    FREE_HASHTABLE(obj->std.properties); 

delete obj->car; 
    efree(obj); 
} 

zend_object_value car_create_handler(zend_class_entry *type TSRMLS_DC) 
{ 
    zend_object_value retval; 

    car_object *obj = (car_object *)emalloc(sizeof(car_object)); 
    memset(obj, 0, sizeof(car_object)); 
    obj->std.ce = type; 

    ALLOC_HASHTABLE(obj->std.properties); 
    zend_hash_init(obj->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); 

#if PHP_VERSION_ID < 50399 
zval *tmp; 
    zend_hash_copy(obj->std.properties, &type->default_properties,                                     (copy_ctor_func_t) zval_add_ref, (void *)&tmp, sizeof(zval *)); 

    #else 
     object_properties_init(&(obj->std), type); 
    #endif 


    retval.handle = zend_objects_store_put(obj, NULL, car_free_storage, NULL           TSRMLS_CC); 
    retval.handlers = &car_object_handlers; 

    return retval; 
} 

PHP_METHOD(Car, __construct) 
{ 
long maxGear; 
    Car *car = NULL; 
    zval *object = getThis(); 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &maxGear) == FAILURE) { 
     RETURN_NULL(); 
    } 

    car = new Car(maxGear);  
car_object *obj = (car_object *) zend_object_store_get_object(object TSRMLS_CC    ); 

//obj->car = car; 

}

... 
... 
zend_function_entry car_methods[] = { 
    PHP_ME(Car, __construct,  NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) 
    PHP_ME(Car, shift,   NULL, ZEND_ACC_PUBLIC) 
    PHP_ME(Car, accelerate,  NULL, ZEND_ACC_PUBLIC) 
    PHP_ME(Car, brake,   NULL, ZEND_ACC_PUBLIC) 
    PHP_ME(Car, getCurrentSpeed, NULL, ZEND_ACC_PUBLIC) 
    PHP_ME(Car, getCurrentGear, NULL, ZEND_ACC_PUBLIC) 
    {NULL, NULL, NULL} 
}; 


PHP_MINIT_FUNCTION(vehicles) 
{ 
    zend_class_entry ce; 

    INIT_CLASS_ENTRY(ce, "Car", car_methods); 
    car_ce = zend_register_internal_class(&ce TSRMLS_CC); 
    car_ce->create_object = car_create_handler; 
    memcpy(&car_object_handlers, zend_get_std_object_handlers(),     sizeof(zend_object_handlers)); 
    car_object_handlers.clone_obj = NULL; 
    return SUCCESS; 
} 

zend_module_entry vehicles_module_entry = { 
#if ZEND_MODULE_API_NO >= 20010901 
    STANDARD_MODULE_HEADER, 
#endif 
    PHP_VEHICLES_EXTNAME, 
    NULL,     /* Functions */ 
    PHP_MINIT(vehicles), 
    NULL,     /* MSHUTDOWN */ 
    NULL,     /* RINIT */ 
    NULL,     /* RSHUTDOWN */ 
    NULL,     /* MINFO */ 
#if ZEND_MODULE_API_NO >= 20010901 
    PHP_VEHICLES_EXTVER, 
#endif 
    STANDARD_MODULE_PROPERTIES 
}; 


ZEND_GET_MODULE (vehicles); 

car.h의 car.cc는 튜토리얼과 동일합니다.

나는 뭔가를 놓친 것 같아. 아마도 함수에서 "object_properties_init(&(obj->std), type);"에 대한 호출이 올바르지 않습니다.

도움을 주셔서 감사합니다 /.

답변

0

car_free_storage 함수에서 delete obj-> car를 두 번 호출하는 것처럼 보입니다. 이것은 좋은 생각이 아닐 수도 있습니다.

최근에 다른 PHP 모듈을 둘러 보았을 때 obj-> std.properties가 항상 유효한 주소로 설정되지는 않는다는 것을 발견했습니다. 따라서 zend_hash_destroy에 전달하기 전에 0이 아닌지 확인해 보는 것이 좋습니다. 내 코드는 다음과 같습니다.

if(obj->std.properties){ 
    zend_hash_destroy(obj->std.properties); 
    FREE_HASHTABLE(obj->std.properties); 
} 
관련 문제