[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    c++ question: alloc'ing and free'ing arrays
From:       Marcos Dione <mdione () grulic ! org ! ar>
Date:       2002-08-03 18:05:24
[Download RAW message or body]


  a friend of mine is developing a class that has lots of arrays of
different types (POD and non-POD types), and the class must resize
those arrays (some are even matices) on runtime.

  so, when using a POD type, she uses
  
  array= NULL;
  
in the default constructor,
  
  array= new int[size];
  
in other constructors (ones that already know which is the size the array should be), 
  
  delete[] array;
  
in the destructor and
  
  if (array!=NULL)
    delete[] array;
  array= new int[size]
  
in the resize method. with non-POD types, she uses

  npt **npa;
  
  npa= NULL;
  
  npa= new npt* [size]
  for (int i= 0; i<size; i++)
    npa[i]= new npt;
  
  for (int i= 0; i<size; i++)
    delete npa[i];
  delete[] npa;
  
  if (npa!=NULL) {
    for (int i= 0; i<size; i++)
      delete npa[i];
    delete[] npa;
  }
  npa= new npt* [size]
  for (int i= 0; i<size; i++)
    npa[i]= new npt;
  
  in the same places respectively.
  
  now, the problem is that in certain circumstances the resize methods
segfault in the new (!!!) statement. using gdb, running the test
program I get this backtrace:

Program received signal SIGSEGV, Segmentation fault.
0x400fdaae in free () from /lib/libc.so.6
(gdb) bt
#0  0x400fdaae in free () from /lib/libc.so.6
#1  0x400fd77a in malloc () from /lib/libc.so.6
#2  0x400fcf54 in malloc () from /lib/libc.so.6
#3  0x400588f9 in __builtin_new () from /usr/lib/libstdc++-libc6.2-2.so.3
#4  0x40058adf in __builtin_vec_new () from /usr/lib/libstdc++-libc6.2-2.so.3
#5  0x0804aa83 in Network::create_errores (this=0x8054938, num_neurons_output=1) at Network.cpp:388
#6  0x0804c140 in operator>> (s=@0xbffffcb8, ntk=@0x8054938) at Network.cpp:657
#7  0x0804900b in main ()
#8  0x400a814f in __libc_start_main () from /lib/libc.so.6

(the create_errores method is a resize method that resizes a POD array
with size= num_neurons_output which is 1). also, looking @ kde's code
for reference, I find that a lot of new statements that alloc arrays
that are not deleted later (examples includes some noatun plugins in
the kdeaddons module, like synaescope.cpp in tippercanoe), or even
arrays that I think are bad deleted, like the cr array in
kdebase/kcontrol/crypto/crypto.cpp:KCryptoConfig::slotCAImport (I
think it should be delete[] instead of delete)

  also, I don't guess *why* new (actually, malloc) is calling free! is
it a libc bug? I don't think so. what's more strange is that the same
code works on other circumstances, like in the constructor. I hope you
can give me a hint on what's going on... also, I would like to know
about any lib that can store and retrieve objects to/from disk. as you
can see, she's trying to parse a Network from an istream.

  thanks in advance
 
>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic