Dear Perl Extenders,

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;
         }











Reply via email to