im new to the xsub system and playing around with a simple c++ class to get used to xsubs. for xs-file and typemap see below.
struct myclass { myclass() { printf("im the myclass constructor\n");} ~myclass() { printf("im the myclass destructor\n");} };
after sending this through the xs machinery (h2xs, perl Makfile.PL etc. ) i get a package called Myclass (in a Module Myclass). in the following script i call the Myclass destructor explicitly:
use Myclass;
$x = new Myclass; $x->DESTROY;
and get the output
[EMAIL PROTECTED]:~/cprog/xsub/Myclass> perl "-Iblib/lib" "-Iblib/arch" test.pl im the myclass constructor im the myclass destructor im the myclass destructor [EMAIL PROTECTED]:~/cprog/xsub/Myclass>
i conclude from this that the destructor has been called twice - once explicitly and once during the "global destruction" process. obviously, the variable $x is defined even after the (first) destructor call.
my question is: can i prevend this in the xsub?
the underlying problem is that i want to wrap a c++-class that contains a dynamically allocated (new'ed) double array, which i have to delete[] in the destructor. and of course, this segfaults on the second destructor call, because ive deleted a pointer twice. i do not want to use perl AVs, because i need the class in other programs without perl. i cannot use swig because it didnt work (and im simply interested in this xs stuff).
Any Ideas where im wrong or what to do?
greetings & many thanks in advance ludwig
the files:
"myclass.h"
struct myclass { myclass() { printf("im the myclass constructor\n");} ~myclass() { printf("im the myclass destructor\n");} };
--------------------------------------------------- "Myclass.xs" generated by h2xs -A myclass.h
#include "EXTERN.h" /* btw. i dont(?) need the 'extern "C"'*/ #include "perl.h" /* statement for my compiler (g++) */ #include "XSUB.h"
#include "ppport.h"
#include <myclass.h>
MODULE = Myclass PACKAGE = Myclass
myclass * myclass::new()
void myclass::DESTROY() -------------------------------------------------- "typemap"
TYPEMAP myclass * O_OBJECT
----and this is stolen from Dean Roehrich:-------- "perlobject.map" (relevant(?) part only)
OUTPUT
# The Perl object is blessed into 'CLASS', which should be a # char* having the name of the package for the blessing. O_OBJECT sv_setref_pv( $arg, CLASS, (void*)$var );
INPUT
O_OBJECT if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) $var = ($type)SvIV((SV*)SvRV( $arg )); else{ warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" ); XSRETURN_UNDEF; }