0

次のコードが与えられます:

imagecopyresized($new_image, $product, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);

imagedestroy($product);
$product = $new_image;
imagedestroy($new_image);

最後の行は、のある種のポインタであるかのように、$productだけ$new_imageでなく、を破棄します。なぜこれが発生し、$product内に*$ new_image *のコピーを効果的に作成してから、リソースを破棄するにはどうすればよいですか?$product$new_image$new_image

4

2 に答える 2

1

$product 同じリソースの識別子です$new_image$product = clone $new_image;画像リソースのコピーを取得するために使用します。imagedestroy($new_image)その後、を破棄せずに呼び出すことができます$product

于 2013-02-11T22:07:26.823 に答える
1

これが発生する理由:

PHPは、コピーオンライトメモリ管理を使用します。つまり、変数にメモリ内の新しいスペースを割り当てることはなく、同じメモリ位置を指すだけです。

これを回避する方法:

imagecopyresized($new_image, $product, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);

imagedestroy($product);
$product = clone $new_image;
imagedestroy($new_image);

http://www.php.net/manual/en/language.oop5.cloning.php

コピーオンライトについて:http: //www.research.ibm.com/trl/people/mich/pub/200901_popl2009phpsem.pdf

于 2013-02-11T22:13:36.813 に答える