All pastes #20764 Raw Edit

FransE

public cpp v1 · immutable
#20764 ·published 2005-08-22 18:23 UTC
rendered paste body
/*I have problem with fixing a crash probably involving a copy constructor or an assignment operator. Here's a code snippet that works:    QDictIterator<FunctionSignature> it(m_signatures);    Q_ASSERT(!it.isEmpty());    for(; it.current(); ++it)        kdDebug(26560) << it.current()->stringSynopsis().string() << endl;However, if I change the first line to:    QDictIterator<FunctionSignature> it(functionSignatures());the Q_ASSERT line crashes, inside the isEmpty() call, which more specifically looks like this:bool  isEmpty() const     { return dict->count() == 0; }The functionSignatures() function has this signature:virtual FunctionSignature::Dict functionSignatures() const;My thought is hence that my SharedDict class is buggy, that something goes wrong when copying the FunctionSignature::Dict object. The SharedDict class is pasted below, and so is the backtrace and valgrind output of the crash.*/------------------------------------------------------------------------------------------------------------------------------------------------------------------   template<typename T> class SharedDict : public QDict<T>    {    public:        SharedDict(int size) : QDict<T>(size)        {        }        SharedDict(const SharedDict<T> & dict) : QDict<T>(dict)        {            kdDebug(26560) << k_funcinfo << endl;            QDictIterator<T> it(dict);            for(; it.current(); ++it)                it.current()->ref();        }        SharedDict() : QDict<T>()        {        }        virtual ~SharedDict()        {        }        virtual void clear()        {            QDictIterator<T> it(*this);            for(; it.current(); ++it)                it.current()->deref();            QDict<T>::clear();        }        virtual void remove(const QString &key)        {            T *item = find(key);            if(item)                item->deref();            QDict<T>::remove(key);        }        QDict<T> &operator=(const QDict<T> &dict)        {            kdDebug(26560) << k_funcinfo << endl;            QDictIterator<T> it(dict);            for(; it.current(); ++it)                it.current()->ref();            QDict<T>::operator=(dict);            return *this;        }        QDict<T> &operator+=(const QDict<T> &dict)        {            QDictIterator<T> it(dict);            for(; it.current(); ++it)                insert(it.currentKey(), it.current());            return *this;        }        virtual void insert(const QString &key, const T *item)        {            Q_ASSERT(item);            const_cast<T *>(item)->ref();            QDict<T>::insert(key, item);        }        virtual void insert(const DOMString &key, const T *item)        {            QDict<T>::insert(key.string(), item);        }        virtual T *find(const DOMString &key) const        {            return static_cast<T *>(QDict<T>::find(key.string()));        }    };------------------------------------------------------------------------------------------------------------------------------------------------------------------/*Program received signal SIGSEGV, Segmentation fault.[Switching to Thread 16384 (LWP 25104)]0x401f0479 in QDictIterator<FunctionSignature>::isEmpty() const (this=0xbfffeb40) at qdict.h:107107         bool  isEmpty() const     { return dict->count() == 0; }#0  0x401f0479 in QDictIterator<FunctionSignature>::isEmpty() const (this=0xbfffeb40) at qdict.h:107#1  0x401ee3a2 in SystemFunctionFactory (this=0x815ddf8)    at SystemFunctionFactory.cpp:187----- SystemFunctionFactory.cpp:187 is the "Q_ASSERT(!it.isEmpty());" line*/------------------------------------------------------------------------------------------------------------------------------------------------------------------/*==25125====25125== Invalid read of size 4==25125==    at 0x1BAE1479: QDictIterator<FunctionSignature>::isEmpty() const (qdict.h:107)==25125==    by 0x1BADF3A1: SystemFunctionFactory::SystemFunctionFactory() (SystemFunctionFactory.cpp:187)[...]==25125==  Address 0x0 is not stack'd, malloc'd or (recently) free'd*/---------------------------------------------------------------------------------