私はC++ apisをperlで公開していた私の会社の本当に古いコードベースを扱わなければなりませんでした。Perl XSガベージコレクション
コードレビューでは、C++で割り当てられていたメモリをガベージコレクトする必要があると提案しました。ここで
は、コードのスケルトンです:
char* convert_to_utf8(char *src, int length) {
.
.
.
length = get_utf8_length(src);
char *dest = new char[length];
.
.
// No delete
return dest;
}
のPerl XS定義:
PROTOTYPE: ENABLE
char * _xs_convert_to_utf8(src, length)
char *src
int length
CODE:
RETVAL = convert_to_utf8(src, length)
OUTPUT:
RETVAL
ので、私はC++関数で作成されたメモリはガベージのPerlによって収集されないだろうというコメントがありました。そして、2つのJava開発者は、perlがC++によって割り当てられたメモリをガベージコレクトするので、クラッシュすると思っています。私は以下のコードを提案した。
CLEANUP:
delete[] RETVAL
私は間違っていますか?
また、このコードを実行し、CLEANUPセクションの有無にかかわらず、メモリ使用率の向上を示しました。しかし、彼らはそれを証明する正確な文書を求めていて、見つけられませんでした。
たPerlクライアント:
use ExtUtils::testlib;
use test;
for (my $i=0; $i<100000000;$i++) {
my $a = test::hello();
}
C++コード:
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include <stdio.h>
char* create_mem() {
char *foo = (char*)malloc(sizeof(char)*150);
return foo;
}
XSコード:
MODULE = test PACKAGE = test
char * hello()
CODE:
RETVAL = create_mem();
OUTPUT:
RETVAL
CLEANUP:
free(RETVAL);
なぜ彼らはPerlがC++によって割り当てられたメモリをガベージコレクトしようと思うのでしょうか?あなたが証明することを求められているのは正確に何ですか? – ysth
@ysth PerlはC++によって割り当てられたメモリをガベージコレクションしません – var