www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2000/10/16/05:31:21

From: "Edmund Horner" <ejrh AT paradise DOT net DOT nz>
Newsgroups: comp.os.msdos.djgpp
References: <39e9f547_4 AT spamkiller DOT newsfeeds DOT com>
Subject: Re: destroy_bitmap in destructor
Lines: 120
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 5.50.4133.2400
X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400
Organization: Paradise Net
Message-ID: <971687834.987432@shelley.paradise.net.nz>
Cache-Post-Path: shelley.paradise.net.nz!unknown AT 203-96-158-147 DOT tnt4 DOT paradise DOT net DOT nz
X-Cache: nntpcache 2.4.0b5 (see http://www.nntpcache.org/)
Date: Mon, 16 Oct 2000 22:17:58 +1300
NNTP-Posting-Host: 203.96.152.26
X-Complaints-To: newsadmin AT xtra DOT co DOT nz
X-Trace: news.xtra.co.nz 971687836 203.96.152.26 (Mon, 16 Oct 2000 22:17:16 NZDT)
NNTP-Posting-Date: Mon, 16 Oct 2000 22:17:16 NZDT
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Please refer to my questions throughout the code...

> struct CEnemy
> {
>    short int ID;
>    BITMAP   *sprite;
>    float     x,
>              y,
>              xvel,
>              yvel;
>    bool      hit, type;
>    short int HP, life;
>
>    CEnemy(int ID, int a, int b, int function);
>    ~CEnemy();
>
>    void (*draw)(BITMAP *bitmap, CEnemy *e); // pointer to function that
> draws bullet
>    bool (*routine)(CEnemy *e);   // pointer to function for updating
bullet
>    short int var1, var2, var3, var4;  // uses depend on bullet type
> }; vector<CEnemy*> E(0);

Since this is quite a complicated struct (constructors, functions, et. al.),
would it not be better calling it a class?

> const int GTop = 500;
> const int GBot = 501;
>
> /* Prototypes for enemy behavior
> ********************************************/
> bool Test(CEnemy *e);
>
> /* Constructor
> **************************************************************/
> CEnemy::CEnemy(int ID, int a, int b, int function):
> x(a), y(b), life(0)
> {

What this tells me is that your struct is descended from classes x, y, and
life, and you are calling those constructors!

Instead, I think you should have (as the first lines of your constructor):

    x = a;
    y = b;
    life = 0;

>    switch(function)
>    {
>       case 0: routine = Test;
>       switch(ID)
>       {
>          case GTop: sprite = create_bitmap(200, 190);
>                     return;
>          case GBot: sprite = create_bitmap(200, 160);
>                     return;
>       }
>    }
> }
>
> CEnemy::~CEnemy()
> {
>    destroy_bitmap(sprite);
> }
>
>
> The problem is in the destructor. If I attempt to empty the vector,.....
>
>
>    vector<CEnemy*>::size_type Esize  = E.size();
>
>    for(int a = 0 ; a < Esize ; a++){
>       delete (E.end() - 1);

I am not sure why you're trying to delete what appears to be an integer
result here...

>       E.pop_back();
>    }
>
> I get a crash at runtime, which follows......
>
> Shutting down Allegro
> Exiting due to signal SIGSEGV
> Page fault at eip=0006a034, error=0006
> eax=ff8bfd88 ebx=001321bc ecx=001321c4 edx=001321c0 esi=00131d9c
> edi=00131d98
> ebp=00131d20 esp=00131d14 program=C:\CHRIS'~1\VERTIC~2\TRANSF~1.EXE
> cs: sel=00af  base=83098000  limit=ffd67fff
> ds: sel=00b7  base=83098000  limit=ffd67fff
> es: sel=00b7  base=83098000  limit=ffd67fff
> fs: sel=00c7  base=00000000  limit=0010ffff
> gs: sel=00c7  base=00000000  limit=0010ffff
> ss: sel=00b7  base=83098000  limit=ffd67fff
> App stack: [00131f14..000b1f14]  Exceptn stack: [000b1e6c..000aff2c]
>
> Call frame traceback EIPs:
>   0x0006a034 _free+28
>   0x00066b33 ___builtin_delete+23, line 0 of new2.cc
>   0x00002f63 ___9TestLevel+403, line 39 of TFAA.cpp
>   0x00005158 _InitLevel__Fi+44, line 707 of TFAA.cpp
>   0x00005289 _PlayGame__Fi+161, line 728 of TFAA.cpp
>   0x00003311 _main+233, line 185 of TFAA.cpp
>   0x000695d2 ___crt1_startup+178
>
> I'm pretty sure it's the destructor that's doing this, because eliminating
> the delete or the destroy_bitmap() seems to fix it, but I see nothing
wrong
> with it (not exactly complex, is it?). And in the call frame traceback;
what
> is new2.cc? This file is nowhere to be found on my hard drive. Hopefully
> someone here can help me with this; it's driving me batty. Thank you.

You don't have the compiler and library sources installed, I expect.
new2.cc is probably the part of the compiler (or library, I can't remember
which) that tells how the new and delete operators work.



- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019