There is a bug in TMap and TObjArray in ROOT 2.24.05. I can't be any
more specific that this, because the error message printed by ROOT is
meaningless (i.e. the ubiquitous "segmentation violation" message).
I have, however, attached a file named CollectionBug.cxx which
reproduces the bug. The bug is only present when CollectionBug.cxx is
interpreted by ROOT. It runs fine when compiled.
Here is the output from ROOT:
root [0] .L CollectionBug.cxx
root [1] CollectionBug bug;
root [2] bug.Print();
baz
foo
bar
*** Break *** segmentation violation
Root > Function Print() busy flag cleared
Regards, Matt
--
Matthew D. Langston
SLD, Stanford Linear Accelerator Center
langston@SLAC.Stanford.EDU
#ifndef __CINT__
#include <TObjString.h>
#include <TObjArray.h>
#include <TMap.h>
#include <iostream>
#endif
class CollectionBug
{
public:
CollectionBug();
void Print();
private:
TMap* fMap;
};
#ifndef __CINT__
int
main( int argc, char* argv[] )
{
CollectionBug bug;
bug.Print();
}
#endif
CollectionBug::CollectionBug()
{
fMap = new TMap();
TObjArray* files;
files = new TObjArray();
files->Add( new TObjString( "1" ) );
fMap->Add( new TObjString( "foo" ), files );
files = new TObjArray();
files->Add( new TObjString( "1" ) );
fMap->Add( new TObjString( "bar" ), files );
files = new TObjArray();
files->Add( new TObjString( "1" ) );
fMap->Add( new TObjString( "baz" ), files );
}
void
CollectionBug::Print()
{
TObjString* name;
TIter next_dataset( fMap );
while ( ( name = dynamic_cast< TObjString* >( next_dataset() ) ) != 0 )
{
cout << name->String() << endl;
TObjArray* files = dynamic_cast< TObjArray* >( fMap->GetValue( name ) );
TIter next_file( files );
}
}
// Local variables:
// compile-command: "g++ `root-config --cflags --libs` -Wl,-rpath,$ROOTSYS/lib -Wall CollectionBug.cxx -o CollectionBug"
// End:
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:26 MET