segfault on vector<struct>
- by Andre
Hello,
I created a struct to hold some data and then declared a vector to hold that struct.
But when I do a push_back I get damn segfault and I have no idea why!
My struct is defines as:
typedef struct Group
{
int codigo;
string name;
int deleted;
int printers;
int subpage;
/*included this when it started segfaulting*/
Group(){ name.reserve(MAX_PRODUCT_LONG_NAME); }
~Group(){ name.clear(); }
Group(const Group &b)
{
codigo = b.codigo;
name = b.name;
deleted = b.deleted;
printers = b.printers;
subpage = b.subpage;
}
/*end of new stuff*/
};
Originally, the struct didn't have the copy, constructor or destructor. I added them latter when I read this post below.
http://stackoverflow.com/questions/676575/seg-fault-after-is-item-pushed-onto-stl-container
but the end result is the same.
There is one this that is bothering me as hell! When I first push some data into the vector, everything goes fine. Later on in the code when I try to push some more data into the vector, my app just segfaults!
The vector is declared
vector<Group> Groups
and is a global variable to the file where I am using it. No externs anywhere else, etc...
I can trace the error to:
_M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage- this->_M_impl._M_start);
in vector.tcc when I finish adding/copying the last element to the vector....
As far as I can tell. I shouldn't be needing anything to do with a copy constructor as a shallow copy should be enough for this. I'm not even allocating any space (but I did a reserve for the string to try out).
I have no idea what the problem is!
I'm running this code on OpenSuse 10.2 with gcc 4.1.2
I'm not really to eager to upgrade gcc because of backward compatibility issues...
This code worked "perfectly" on my windows machine. I compiled it with gcc 3.4.5 mingw without any problems...
help!
--- ... ---
:::EDIT:::
I push data
Group tmp_grp;
(...)
tmp_grp.name = "Nova ";
tmp_grp.codigo=GetGroupnextcode();
tmp_grp.deleted=0;
tmp_grp.printers=0;
tmp_grp.subpage=0;
Groups.push_back(tmp_grp);