看板 EE_DSnP 關於我們 聯絡資訊
※ 引述《BloodyDuke (個巴樂)》之銘言: : 恩我省略了部份程式碼,buffer是一個string(全域)在main中由檔案輸入的 : buffersize也在main裡決定(且是全域變數) : class Char{ : friend class Bomb; : public: : Char():_numChar(0){} : void genChar(); : void toScreen(); : private: : int _numChar; : vector<Bomb*> _bomb; : }; : class Bomb{ : public: : Bomb(char); : char getCh(){return _ch;} : int& getColumn(){return _column;} : int& getRow(){return _row;} : private: : char _ch; : int _column; : int _row; : }; : //main 呼叫一次,產生所有的bomb : void Char::genChar(){ : for(int i=0;vector<Bomb*>::iterator it=_bomb.begin(); : i<bufferSize;i++,it++) : *it=new Bomb(buffer[i]); : ^^^^^^^^^^^^^^^^^^^^^^^^ 你要分清楚 vector 裡面的 element 到底存了幾個? 簡單的說: 1. 只宣告 vector<Bomb*> ==> size = capacity = 0; 此時若去 access *it ==> crash! 2. vector<Bomb *> _arr(10); ==> size = capacity = 10; OK 去存取 _arr[0] ~ _arr[10], or *it between [begin(), end()) 3. 只宣告 vector<Bomb*> 但是用 push_back 將 element 塞入, 如: _arr.push_back(new Bomb); 4. 只宣告 vector<Bomb*> 但是用 reserve() 先去要記憶體 ==> size 不變, 但是 capacity 變成新的值. 所以很明顯的, 你的 array 還是空的 (you can check with end()), 但是卻去 access *it : //這行存取違規 : } : //在main中被循環呼叫 讓字母(Bomb)往下掉 : void Char::toScreen(){ : if(_numChar<bufferSize) : _numChar++; : int i=0; : for(vector<Bomb*>::iterator it=_bomb.begin(); : i<_numChar;i++,it++){ : int &col=(*it)->getColumn(); : int &row=(*it)->getRow(); : ^^^^^^^^^^^^^^^^^^^^^^^^^ : //這裡也會存取違規 : if((*it!=(Bomb*)DELETED)||(*it!=(Bomb*)FAIL)){ : screen[col][row++]=(*it)->getCh(); : } : if (((*it)->getRow()==Row)||(*it)->checkBelow()){ : delete *it; : (*it)=(Bomb*)FAIL; : } : } : } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.4.96
BloodyDuke:恩了解了,其實這我有查到,只是沒想清楚,感謝回答 01/17 01:58
wintercobra:老師,如果有問題可以拿去問你嗎?電二444? 01/18 01:15
ric2k1:我現在在國外, 請用 e-mail 先... 01/18 06:23