c++ - vector.push_back fails allocating memory -
im new programming , can't solve following error. dynamic allocated memory seems faulty. tried google people similar problem.
"windows has triggered breakpoint" @ _crtisvalidheappointer
call stack: msvrc110d.dll!_crisvalidheappointer(const void* puserdata) line 2036 msvrc110d.dll!_free_dbg_nolock(void* puserdata, int nblockuse) line 1322 msvrc110d.dll!_free_dbg(void* puserdata, int nblockuse) line 1265 msvrc110d.dll!operator delete(void* puserdata) line 54 editor.exe!std::allocator<ceditbox>::deallocate(ceditbox* _ptr, unsigned int__formal) line 586 editor.exe!std::_wrap_alloc<<std::allocator<ceditbox> >::deallocate(ceditbox* _ptr, unsigned int_count) line 888 editor.exe!std::vector<ceditbox,std::allocator<<ceditbox> >::_reallocate(unsigned int_count) line 1518 editor.exe!std::vector<ceditbox,std::allocator<<ceditbox> >::_reserve(unsigned int_count) line 1532 editor.exe!std::vector<ceditbox,std::allocator<<ceditbox> >::push_back(ceditbox&&_val)line 851 this error occurs when second editbox pushed vector. looks strange me when push 2 buttons buttons vector no error occurs, button class same editbox class.
this except of manager class
ccontrols std::vector<ceditbox> editboxes; std::vector<cbutton> buttons; ccontrols::ccontrols(sf::renderwindow& pawindow, cassetmanager& paam) : window(pawindow), am(paam) { activecontrol = sf::vector2i(0,0); } ccontrols::~ccontrols(void){ } void ccontrols::addeditbox(int patype, sf::vector2i papos){ editboxes.push_back(ceditbox(patype, papos, window, am)); } void ccontrols::addbutton(int patype, sf::string pacaption,sf::vector2i papos){ buttons.push_back(cbutton(patype, pacaption, papos, window,am)); } these 2 other classes
ceditbox::ceditbox(int patype, sf::vector2i papos, sf::renderwindow& pawindow, cassetmanager& paam) : window(pawindow), font(paam.getfont()), line(sf::rectangleshape(sf::vector2f(2, 20))){ active = false; visible = false; pos = papos; switch(patype){//templates editboxes case 1: maxchar = 4; sprite.settexture(paam.gettexture(2)); sprite.settexturerect(paam.gettexturerect(209)); text.setfont(font); text.setcharactersize(20); text.setposition(papos.x + 5, papos.y + 5); text.setcolor(sf::color::black); line.setposition(pos.x + 5, pos.y + 8); line.setfillcolor(sf::color::black); break; case 2: maxchar = 20; sprite.settexture(paam.gettexture(2)); sprite.settexturerect(paam.gettexturerect(210)); text.setfont(font); text.setcharactersize(20); text.setposition(papos.x + 5, papos.y + 5); text.setcolor(sf::color::black); line.setposition(pos.x + 5, pos.y + 8); line.setfillcolor(sf::color::black); break; } text.setstring(sf::string("")); sprite.setposition(pos.x, pos.y); size = sf::vector2i(sprite.gettexturerect().width, sprite.gettexturerect().height); } ceditbox::~ceditbox(void){ } void ceditbox::draw(){ window.draw(sprite); if(active){ window.draw(line); } if(text.getstring() != ""){ window.draw(text); } } bool ceditbox::inbounds(sf::vector2i papos){ if(papos.x > pos.x && papos.y > pos.y && papos.x < pos.x + size.x && papos.y < pos.y + size.y){ return true; }else{ return false; } } void ceditbox::setvisible(bool pavisible){ visible = pavisible; } bool ceditbox::isvisible(){ return visible; } void ceditbox::settext(std::string patext){ text.setstring(patext); line.setposition(pos.x + text.getlocalbounds().width + 5, pos.y + 8); } void ceditbox::setactive(bool paactive){ active = paactive; } bool ceditbox::hasmaxchar(){ if(text.getstring().getsize() >= 4){ return true; }else{ return false; } } cbutton::cbutton(int patype, sf::string pacaption,sf::vector2i papos, sf::renderwindow& pawindow, cassetmanager& paam) : window(pawindow), font(paam.getfont()){ hover = false; visible = false; clicked = false; pos = papos; switch(patype){//templates buttons case 1: sprite.settexture(paam.gettexture(2)); sprite.settexturerect(paam.gettexturerect(206)); spritehover.settexture(paam.gettexture(2)); spritehover.settexturerect(paam.gettexturerect(207)); spriteclick.settexture(paam.gettexture(2)); spriteclick.settexturerect(paam.gettexturerect(208)); text.setfont(font); text.setcharactersize(20); text.setcolor(sf::color::black); break; case 2: sprite.settexture(paam.gettexture(2)); sprite.settexturerect(paam.gettexturerect(203)); spritehover.settexture(paam.gettexture(2)); spritehover.settexturerect(paam.gettexturerect(204)); spriteclick.settexture(paam.gettexture(2)); spriteclick.settexturerect(paam.gettexturerect(205)); text.setfont(font); text.setcharactersize(20); text.setcolor(sf::color::black); } text.setstring(pacaption); sprite.setposition(pos.x, pos.y); spritehover.setposition(pos.x, pos.y); spriteclick.setposition(pos.x, pos.y); size = sf::vector2i(sprite.gettexturerect().width, sprite.gettexturerect().height); //center alignment sf::floatrect textrect = text.getlocalbounds(); text.setorigin(textrect.left + textrect.width/2.0f, textrect.top + textrect.height/2.0f); text.setposition((float)(pos.x + (size.x / 2)), (float)(pos.y + (size.y / 2))); } cbutton::~cbutton(void){ } void cbutton::draw(){ if(clicked){ window.draw(spriteclick); if(clickedframes == 0){ clicked = false; }else{ clickedframes -= 1; } }else{ if(hover){ window.draw(spritehover); }else{ window.draw(sprite); } } if(text.getstring() != ""){ window.draw(text); } } bool cbutton::inbounds(sf::vector2i papos){ if(papos.x > pos.x && papos.y > pos.y && papos.x < pos.x + size.x && papos.y < pos.y + size.y){ return true; }else{ return false; } } void cbutton::setvisible(bool pavisible){ visible = pavisible; } bool cbutton::isvisible(){ return visible; } void cbutton::settext(std::string patext){ text.setstring(patext); } void cbutton::sethover(bool pahover){ hover = pahover; } void cbutton::click(){ clicked = true; clickedframes = 400; } im using default copy-constructor.
i can prevent program crashing, if "editboxes.reserve(editboxes.size() + 2);" before pushing object vector, +1 wont help.
what reason error? (sry unclean code)
edit: definition of editbox
#pragma once #include <sfml/graphics.hpp> #include "assetmanager.hpp" class ceditbox { public: ceditbox(int patype, sf::vector2i papos, sf::renderwindow& pawindow, cassetmanager& paam); ~ceditbox(void); void draw(); bool inbounds(sf::vector2i papos); void setvisible(bool pavisible); bool isvisible(); void settext(std::string patext); void setactive(bool paactive); bool hasmaxchar(); private: sf::vector2i pos; sf::font& font; sf::text text; sf::sprite sprite; sf::vector2i size; int maxchar; bool visible; bool active; sf::renderwindow& window; sf::rectangleshape line; };
the problem not vector. issue classes , types you're storing in vector.
when want type stored in std::vector, requirement type has proper copy semantics. in other words, if there issue in creating , destroying copies of ceditbox, vector have problem.
for example, code work properly?
int main() { ceditbox e1( /* construct 1 */ ); // fill e1 information (not shown) //.. ceditbox e2 = e1; ceditbox e3( /*fill parameters*/ ); e3 = e1; } if program causes issues, can't store ceditbox in vector. program above should able copy, assign, , destroy 3 instances of ceditbox without issue (no double-deletes, no memory leaks, etc.)
i see link: http://sfml-dev.org/documentation/2.0/classsf_1_1sprite.php describes sf::sprite class. have instances of sf::sprite in ceditbox class, , in description of sf::sprite mention can copied without issue. right there, in trouble.
if sample above not work correctly, suggest consider using std::vector<std::unique_ptr<ceditbox>> or std::vector<std::shared_ptr<ceditbox>> -- in other words, smart pointers ceditbox's.
Comments
Post a Comment