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

Popular posts from this blog

javascript - RequestAnimationFrame not working when exiting fullscreen switching space on Safari -

jsf - How to ajax update an item in the footer of a PrimeFaces dataTable? -

jquery - Keeping Kendo Datepicker in min/max range -