morfis
12th June 2012, 02:00
I would like to have QMap as a part of class, so I add pointer to QMap in class private section, invoke a constructor of QMap in class constructor, and invoke destructor of QMap in class destructor. But if I invoke destructor of QMap, Segmentation fault is signaled. What do I wrong?
#include <QtCore/QCoreApplication>
#include <QMap>
#include <QMutableMapIterator>
class Segment
{
public:
Segment(quint32 sourceIP, quint32 destinationIP,
quint32 sequenceNumber,const unsigned char *segment)
{
qDebug("%s",Q_FUNC_INFO);
srcIP=sourceIP;
dstIP=destinationIP;
seqNo=sequenceNumber;
data=segment;
};
~Segment()
{
qDebug("%s",Q_FUNC_INFO);
};
quint32 srcIP;
quint32 dstIP;
quint32 seqNo;
private:
const unsigned char *data;
};
class Connection
{
public:
Connection(quint32 sourceIP, quint32 destinationIP)
{
qDebug("%s",Q_FUNC_INFO);
srcIP= sourceIP;
dstIP= destinationIP;
dstRCVMap= new QMap<quint32, Segment*>;
};
~Connection()
{
qDebug("%s",Q_FUNC_INFO);
QMutableMapIterator<quint32, Segment*> mapIter2(*dstRCVMap);
while (mapIter2.hasNext()){
Segment *segment= mapIter2.next().value();
delete segment;
mapIter2.remove();
};
delete dstRCVMap;//Problem
qDebug("END OF %s",Q_FUNC_INFO);
};
void append(Segment *segment)
{
qDebug("%s",Q_FUNC_INFO);
if (segment->srcIP==srcIP && segment->dstIP==dstIP)
dstRCVMap->insert(segment->seqNo, segment);
else
delete segment;
};
private:
quint32 srcIP;
quint32 dstIP;
QMap<quint32, Segment*> *dstRCVMap;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
quint32 fakeIP1=123;
quint32 fakeIP2=456;
Connection con(fakeIP1,fakeIP2);
const unsigned char rawSegment[20]={0};
quint32 fakeSeqNo=1;
con.append(new Segment(fakeIP1,fakeIP2,fakeSeqNo,rawSegment));
// return a.exec();
}
#include <QtCore/QCoreApplication>
#include <QMap>
#include <QMutableMapIterator>
class Segment
{
public:
Segment(quint32 sourceIP, quint32 destinationIP,
quint32 sequenceNumber,const unsigned char *segment)
{
qDebug("%s",Q_FUNC_INFO);
srcIP=sourceIP;
dstIP=destinationIP;
seqNo=sequenceNumber;
data=segment;
};
~Segment()
{
qDebug("%s",Q_FUNC_INFO);
};
quint32 srcIP;
quint32 dstIP;
quint32 seqNo;
private:
const unsigned char *data;
};
class Connection
{
public:
Connection(quint32 sourceIP, quint32 destinationIP)
{
qDebug("%s",Q_FUNC_INFO);
srcIP= sourceIP;
dstIP= destinationIP;
dstRCVMap= new QMap<quint32, Segment*>;
};
~Connection()
{
qDebug("%s",Q_FUNC_INFO);
QMutableMapIterator<quint32, Segment*> mapIter2(*dstRCVMap);
while (mapIter2.hasNext()){
Segment *segment= mapIter2.next().value();
delete segment;
mapIter2.remove();
};
delete dstRCVMap;//Problem
qDebug("END OF %s",Q_FUNC_INFO);
};
void append(Segment *segment)
{
qDebug("%s",Q_FUNC_INFO);
if (segment->srcIP==srcIP && segment->dstIP==dstIP)
dstRCVMap->insert(segment->seqNo, segment);
else
delete segment;
};
private:
quint32 srcIP;
quint32 dstIP;
QMap<quint32, Segment*> *dstRCVMap;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
quint32 fakeIP1=123;
quint32 fakeIP2=456;
Connection con(fakeIP1,fakeIP2);
const unsigned char rawSegment[20]={0};
quint32 fakeSeqNo=1;
con.append(new Segment(fakeIP1,fakeIP2,fakeSeqNo,rawSegment));
// return a.exec();
}