我不得不处理我公司中一个非常古老的代码库,它通过 perl 公开了 C++ api。
在代码审查中,我建议有必要对在 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);