2012-04-17 67 views
2

我在Linux上运行PHP 5.4.0。PHP模块在ts_allocate_dtor上崩溃

以下是在ZEND_MINIT_FUNCTION

#ifdef ZTS 
ts_allocate_id(&sample_globals_id, 
    sizeof(zend_sample_globals), 
    (ts_allocate_ctor) php_sample_init_globals, 
    (ts_allocate_dtor) php_sample_destroy_globals); 
#else 
    php_sample_init_globals(& sample_globals TSRMLS_CC); 
#endif 

此代码崩溃的代码中,当模块完成其MSHUTDOWN。 GDB点TSRM.c,这一行(调用析构函数):

if (p->storage[j]) { 
    if (resource_types_table && !resource_types_table[j].done && resource_types_table[j].dtor) { 
    resource_types_table[j].dtor(p->storage[j], &p->storage); 
    } 
free(p->storage[j]); 
} 

更奇怪的是,当我用NULL代替析构函数,它的工作原理。像这样:

ts_allocate_id(&sample_globals_id, 
    sizeof(zend_sample_globals), 
    (ts_allocate_ctor) php_sample_init_globals, 
    NULL); //Works, but destructor is not called 

也许任何人有一个想法,为什么会发生这种情况? 谢谢

+0

什么形式的崩溃?这可能是双倍免费的吗? – 2012-04-18 01:03:45

+0

我不这么认为,即使析构函数php_sample_destroy_globals()为空时也会崩溃。 崩溃是分段错误 – Vasisualiy 2012-04-18 10:18:58

+0

实际上,它与这种情况看起来非常相似 http://osdir.com/ml/php.pecl.devel/2007-03/msg00036.html – Vasisualiy 2012-04-18 10:30:02

回答

2

找到它。 奇怪的是,这在任何教程中都没有描述,但答案在于ext目录中的源代码。

我已经添加了下面的代码,以MSHUTDOWN

#ifdef ZTS 
    ts_free_id(sample_globals_id); 
#endif 

而现在它工作正常。 Phhew ...