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