我不擅长 C 中的指针)
我的 PHP 扩展中的内存分配有问题。我正在尝试调用一个返回浮点数组的函数。
我用 C 写了一个小测试脚本,它可以工作。
基本上就是,
float *fld;
...
ier = c_fstluk(fld, key, &ni, &nj, &nk);
...
// Read the array as a 2d field
for (i=0; i<ni; i++) {
for (j=0; j<nj; j++) {
// Values come transposed..
printf("%15.6E", *(fld+(ni*j)+i));
if (j<nj-1) printf(", ");
}
printf("\n");
}
(完整代码)
在这里我不需要malloc
或free
任何东西。(至少我不这么认为。在这个代码和函数的fortran版本中,我需要先allocate()
fld。)
然而,在我的 PHP 扩展中,相同的代码返回了一个段错误。
当我在调用之前emalloc
和efree
(或只是malloc
和free
) fldc_fstluk
时,它可以工作,但是我得到了大量的内存错误。
[Wed Jan 9 15:34:33 2013] Script: '/Users/matt/aurams/trunk/web/php/php-src/ext/fstd/fstd.php'
/Users/matt/aurams/trunk/web/php/php-src/Zend/zend_API.c(1295) : Freeing 0x10D953060 (72 bytes), script=/Users/matt/aurams/trunk/web/php/php-src/ext/fstd/fstd.php
/Users/matt/aurams/trunk/web/php/php-src/Zend/zend_hash.c(412) : Actual location (location was relayed)
Last leak repeated 779 times
[Wed Jan 9 15:34:33 2013] Script: '/Users/matt/aurams/trunk/web/php/php-src/ext/fstd/fstd.php'
/Users/matt/aurams/trunk/web/php/php-src/Zend/zend_API.c(1292) : Freeing 0x10D9531A0 (32 bytes), script=/Users/matt/aurams/trunk/web/php/php-src/ext/fstd/fstd.php
Last leak repeated 779 times
[Wed Jan 9 15:34:33 2013] Script: '/Users/matt/aurams/trunk/web/php/php-src/ext/fstd/fstd.php'
ext/fstd/fstd.c(414) : Freeing 0x10D9538D0 (72 bytes), script=/Users/matt/aurams/trunk/web/php/php-src/ext/fstd/fstd.php
/Users/matt/aurams/trunk/web/php/php-src/Zend/zend_API.c(982) : Actual location (location was relayed)
Last leak repeated 29 times
[Wed Jan 9 15:34:33 2013] Script: '/Users/matt/aurams/trunk/web/php/php-src/ext/fstd/fstd.php'
/Users/matt/aurams/trunk/web/php/php-src/Zend/zend_hash.c(450) : Freeing 0x10D954C08 (256 bytes), script=/Users/matt/aurams/trunk/web/php/php-src/ext/fstd/fstd.php
Last leak repeated 29 times
=== Total 1620 memory leaks detected ===
(带注释的完整代码emalloc
,第 ~398 行)
我敢打赌我在这里遗漏了一些简单的东西..
总而言之,在独立的 C 程序中,东西可以在没有任何分配的情况下工作。在 PHP 扩展中,当我分配空间时它可以工作,但会引发内存错误,当我不分配空间时,它会出现故障。
帮助?谢谢!