Gary Stainburn wrote:

> Hi folks,
>
> My first forrey into Perl objects sees me trying to model a railway.  I've got
> a hash of named blocks of track, which is added to when I create a new block
> object.
>
> My problem is one of destroying a block (object), making sure that I have no
> memory leakage.
>
> I create a new track block such:
>
> my $T1=Trainset->track('T1','Block');
>
> This also created $Trainset::_BLOCKS{T1} which references the object.

Hi Gary,

I really think your problem comes in here.  I would always be leery of situations
where you have to use the namespace prefix explicitly.  It generally  casts too
broad a net for most purposes.  I think you are doing the right thing--sort
of--with Trainset.  This is assumig that you have a Trainset class as well as a
Track class.  I would suggest, though, that you assign new $track to your object
through $train_set, your Trainset object, rather than through the class itself.
This apporoach would give you the flexibility to have mutliple Trainset objects,
thus make your class more robust.

>
>
> My problem is how can I destroy the object when I no longer want it?
>
> If I call
>
> $T1=$T1->delete;
>
> Then the object is destroyed (display in DESTROY shows this).  However, if I
> simply call
>
> $T1->delete;
>
> The object isn't destroyed because even though the ref in %_BLOCKS is deleted,
> the ref in $T1 is still there.  Is there and way to ensure that the object is
> destroyed - i.e. force the refcount to zero?
>
> The only solution I've come up with is to explicitly call DESTROY from within
> the delete function, and within DESTROY empty the hash. Is this sufficient,
> or will this still tie up memory?  Is there a better way?
>
> --
> Gary Stainburn

Overall, I would suggest that you steer clear of internal references in your
objects when possible.  It is much better to make a container class, then delete
contained objects from the container.  Generally you would want to avoid having
other references to the contained objects, except through the methods of the
container [Trainset] object.

package Trainset;

use strict, warnings et. al.;

use Exporter;

our @ISA = qw/Eporter/;

sub new {
   my $class = shift;
   my $self = {};
   bless $self, $class;
   $self->initialize(@_);
}

sub initialize {
   my $self = shift;

   $self->{'set ID'} = shift;
   #... assign other set-level scalar info hard-coded into
   #    the parameter list ...then:
   push @{$self->{'tracks'}}, (@_};  # to allow initialization with an existing
list
}

sub add_track {
   my $self = shift;

   my $track = shift;
   push @{$self->{'tracks'}}, $track;
}

...

Let your train set be one object, and your tracks be represented by another
class.  Keep each as simple and straightforward as possible.

Joseph


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to