Hi,
I was trying to use TObject::Clone() to copy an object which included a TArrayF, which gave me the following messages twice, followed somewhat later by a segmentation violation.
Error in <TExMap::Add>: key 2 is not unique
I tracked it back to TBuffer::ReadClass, appended (in edited form) below. My comments are noted with //** at the left. Is this a bug or am I missing something? I'm using 2.22/10 on RedHat 6.0. And is this likely to be causing my Segvio later on?
TClass *TBuffer::ReadClass(const TClass *clReq, UInt_t *objTag)
{
[...]
// read byte count and/or tag (older files don't have byte count)
UInt_t bcnt, tag, startpos = 0;
*this >> bcnt;
if (!(bcnt & kByteCountMask) || bcnt == kNewClassTag) {
tag = bcnt;
bcnt = 0;
} else {
fVersion = 1;
startpos = UInt_t(fBufCur-fBuffer);
*this >> tag;
}
//** It appears that this TArrayF at least
//** has bcnt == kNewClassTag = 0xffffffff, so
//** startpos is still zero after this if.
// in case tag is object tag return tag
if (!(tag & kClassMask)) {
if (objTag) *objTag = tag;
return 0;
}
//** Since tag is now ffffffff, it & kClassMask are true of course, so this is
//** skipped.
TClass *cl;
if (tag == kNewClassTag) {
//** It enters here...
// got a new class description followed by a new object
// (class can be 0 if class dictionary is not found, in that
// case object of this class must be skipped)
cl = TClass::Load(*this);
// add class to fReadMap for later reference
if (fVersion > 0) {
// check if class was already read
TClass *cl1 = (TClass *)fReadMap->GetValue(startpos+kMapOffset);
//** But startpos is still 0... kMapOffset = 2, so this is is then causing
//** the error message of '2' having multiple readings. This has apparently
//** happened once before already to cause the error message, that I didn't see.
if (cl1 != cl)
MapObject(cl ? cl : (TObject*) -1, startpos+kMapOffset);
} else
MapObject(cl, fMapCount);
[... rest snipped... ]
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:38 MET