stl segfaults

  • From: "Littlefield, Tyler" <tyler@xxxxxxxxxxxxx>
  • To: <programmingblind@xxxxxxxxxxxxx>
  • Date: Sun, 1 Aug 2010 09:05:01 -0600

Hello all,
I've pretty much got my variant working, but I'm having a bit of an issue.
When I call AddVar, with the below code:
mobile->AddVar("str", 1);
addvar looks like:
  template <class T>
  BOOL AddVar(const std::string &name, T val)
  {
    std::cout << "Adding " << name << " with value " << val << "." << std::endl;
    if (VarExists(name))
      {
        std::cout << "Var exists!" << std::endl;
        return false;
      }
    (*_vars)[name]=val;
    return true;
  }
now I see the cout statement being ran, and the value looks fine. but the 
program segfaults in VarExists. Well, it segfaults in the guts of the stl lib. 
VarExists looks like:
BOOL Entity::VarExists(const std::string &name) const
  {
return (_vars->count(name));
  }
and the backtrace from gdb:
#0  0x08055da7 in std::_Rb_tree<std::string, std::pair<std::string const, 
Variant>, std::_Select1st<std::pair<std::string const, Var
iant> >, std::less<std::string>, std::allocator<std::pair<std::string const, 
Variant> > >::find (this=0x0, __k=...)
at /usr/include/c++/4.4/bits/stl_tree.h:1434
#1  0x08052575 in std::map<std::string, Variant, std::less<std::string>, 
std::allocator<std::pair<std::string const, Variant> > >::c
ount (this=0x808d208, name=...) at /usr/include/c++/4.4/bits/stl_map.h:686
#2  Entity::VarExists (this=0x808d208, name=...) at entity.cpp:318
#3  0x0807af83 in Entity::AddVar<int> (this=0x808d208, name=..., val=1) at 
components/../entity.h:126
#4  0x0807ac0f in STATS_ATTACHED (args=0x0, caller=0x808d208) at 
components/stats.cpp:29
#5  0x080651c9 in Event::Invoke (this=0x808d348, args=0x0, caller=0x808d208) at 
event.cpp:35
#6  0x080659e2 in EventManager::CallEvent (this=0x808d20c, name=..., args=0x0, 
caller=0x808d208) at event.cpp:143
#7  0x0806910d in Component::Attach (this=0x808d208, obj=0x808cac8) at 
component.cpp:55
#8  0x08053974 in Entity::AddComponent (this=0x808cac8, component=0x808d208) at 
entity.cpp:265
#9  0x0807a4e5 in STATS_ADD (args=0x0, caller=0x808cac8) at 
components/stats.cpp:40
#10 0x080651c9 in Event::Invoke (this=0x808b690, args=0x0, caller=0x808cac8) at 
event.cpp:35
#11 0x080659e2 in EventManager::CallEvent (this=0x8089008, name=..., args=0x0, 
caller=0x808cac8) at event.cpp:143
#12 0x0805f359 in Server::PollSockets (this=0x8089070) at server.cpp:273
#13 0x0804b409 in World::Update (this=0x8089008) at world.cpp:224
#14 0x0805f53c in GameLoop () at main.cpp:180
#15 0x08060221 in main (argc=1, argv=0xbffff404) at main.cpp:121 
Only thing I can think of is a corrupt _vars, but this shows that that's not 
the case:
(gdb) up
#1  0x08052575 in std::map<std::string, Variant, std::less<std::string>, 
std::allocator<std::pair<std::string const, Variant> > >::c
ount (this=0x808d208, name=...) at /usr/include/c++/4.4/bits/stl_map.h:686
686           { return _M_t.find(__x) == _M_t.end() ? 0 : 1; }
(gdb) up
#2  Entity::VarExists (this=0x808d208, name=...) at entity.cpp:318
318     return (_vars->count(name));
(gdb) print _vars
$1 = (
    std::map<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, Variant, std::less<std::basic_string<char, std:
:char_traits<char>, std::allocator<char> > >, 
std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, 
std::allocato
r<char> > const, Variant> > > *) 0x0
(gdb) 
so I'm totally lost. Any help would be awesome.
Thanks,

Other related posts:

  • » stl segfaults - Littlefield, Tyler