samedi 28 février 2015

Segfault on accessing class type members


I'm trying to fix segfault error, and after 5 hours of trying different methods I can't find solution.


I have following class :



class CCharacter : public boost::enable_shared_from_this<CCharacter>//, private boost::noncopyable
{
public:
CCharacter(DWORD uid, std::string name, WORD level, BYTE job, BYTE face, WORD str, WORD agi, WORD vit, WORD dex, WORD ine, WORD status_points, float x, float y, WORD map_index, DWORD hp, DWORD mp, DWORD sp);
virtual ~CCharacter();

DWORD m_dwUID;

WORD m_btLevel;

BYTE m_btFace;

BYTE m_btJob;

WORD m_wStrength;
WORD m_wDexterity;
WORD m_wVitality;
WORD m_wAgility;
WORD m_wIntelligence;
WORD m_wStatusPoints;

float m_fltX, m_fltY;

WORD m_wMapIndex;

DWORD m_dwHealth;
DWORD m_dwMana;
DWORD m_dwStamina;

DWORD m_dwMaxHealth;
DWORD m_dwMaxMana;
DWORD m_dwMaxStamina;

DWORD m_dwAttack;
DWORD m_dwDefense;

std::map<DWORD, CItem*>& getEquipment()
{
return m_mapEquipedItems;
}

void setEquipment(std::map<DWORD, CItem*> val)
{
m_mapEquipedItems = val;
}

std::string getName()
{
return m_strName;
}

private:

std::string m_strName;

std::map<DWORD, CItem*> m_mapEquipedItems;


};


Every value is initialized in constructor by following way :



Character::CCharacter(DWORD uid, std::string name, WORD level, BYTE job, BYTE face, WORD str, WORD agi, WORD vit, WORD dex, WORD ine, WORD status_points, float x, float y, WORD map_index, DWORD hp, DWORD mp, DWORD sp) :
m_dwUID(uid), m_btLevel(level), m_btFace(face), m_btJob(job), m_wStrength(str), m_wDexterity(dex), m_wVitality(vit), m_wAgility(agi), m_wIntelligence(ine), m_wStatusPoints(status_points), m_fltX(x), m_fltY(y), m_wMapIndex(map_index),
m_dwHealth(hp), m_dwMana(mp), m_dwStamina(sp), m_strName(name), m_mapEquipedItems()


Character class is allocated from begining as shared_pointer and is stored in std container.


Problem occurs when i want use class-type memebers.


I receive SEGFAULT only when i use for example getName() method, or directly get m_strName if it is public.


Same with m_mapEquipedItems.


I use it in following context :



CPacket * generateCharacterPacket(std::vector<SPCHARACTER> characters)

{
CPacket * pkt = new CPacket(characters.size() * 653 + 11, 3, 4, true);

// result
pkt->setByte(0x01, 0);

// reason
pkt->setByte(0x01, 1);


...



DWORD counter = 0;

for(std::vector<SPCHARACTER>::iterator iter = characters.begin(); iter != characters.end();iter++)
{
pkt->write((*iter)->getName(), 3 + 653 * counter); // segfault

if((*iter)->m_btJob == 2)
{
pkt->write((BYTE)2, 40 + 3 + 653 * counter);
pkt->write((BYTE)2, 48 + 3 + 653 * counter);
}
else
{
pkt->write((BYTE)1, 40 + 3 + 653 * counter);
pkt->write((*iter)->m_btJob, 48 + 3 + 653 * counter);
}

pkt->write(std::string("0000000000000000"), 17 + 3 + 653 * counter);

pkt->write((BYTE)1, 34 + 3 + 653 * counter);
pkt->write((BYTE)(*iter)->m_btFace, 42 + 3 + 653 * counter);
pkt->write((BYTE)1, 44 + 3 + 653 * counter);
pkt->write((BYTE)2, 52 + 3 + 653 * counter);
pkt->setByte((unsigned BYTE)(*iter)->m_btLevel, 54 + 3 + 653 * counter);



pkt->write((float)(*iter)->m_fltX, 68 + 3 + 653 * counter);
pkt->write((float)(*iter)->m_fltY, 72 + 3 + 653 * counter);

pkt->write((DWORD)(*iter)->m_dwHealth, 56 + 3 + 653 * counter);
pkt->write((DWORD)(*iter)->m_dwMana, 60 + 3 + 653 * counter);

pkt->setWord((*iter)->m_wStrength, 576 + 3 + 653 * counter);
pkt->setWord((*iter)->m_wDexterity, 578 + 3 + 653 * counter);
pkt->setWord((*iter)->m_wVitality, 580 + 3 + 653 * counter);
pkt->setWord((*iter)->m_wAgility, 582 + 3 + 653 * counter);
pkt->setWord((*iter)->m_wIntelligence, 584 + 3 + 653 * counter);

std::map<DWORD, CItem*> equipment = (*iter)->getEquipment(); // SEGFAULT
std::map<DWORD, CItem*>::iterator iter2;

for(iter2 = equipment.begin(); iter2 != equipment.end();iter2++)
pkt->setDword(iter2->second->getItemData()->m_dwVnum, iter2->first * 12 + 116 + 3 + 653 * counter);


counter++;
}


return pkt;
}


Where is the problem ? DWORDS, WORDS are accessed without problem, but accessing any class type member provides segfault.




Aucun commentaire:

Enregistrer un commentaire