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
也许任何人有一个想法,为什么会发生这种情况? 谢谢
什么形式的崩溃?这可能是双倍免费的吗? – 2012-04-18 01:03:45
我不这么认为,即使析构函数php_sample_destroy_globals()为空时也会崩溃。 崩溃是分段错误 – Vasisualiy 2012-04-18 10:18:58
实际上,它与这种情况看起来非常相似 http://osdir.com/ml/php.pecl.devel/2007-03/msg00036.html – Vasisualiy 2012-04-18 10:30:02