我不得不处理我公司的一个非常老的代码库,它通过perl暴露了C++ apis。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