看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《gppo (香蕉是什麼?)》之銘言: : 找到錯誤的原因了 : 寫了一段簡短的code做說明 : #include <cstdlib> : #include <iostream> : #include <vector.h> : using namespace std; : class TypeA : { : public: : TypeA( ) {cout << "-----build TypeA-----"<<endl; } : ~TypeA() {cout << "-----delete TypeA-----"<<endl; } : vector<int> cells; : }; : int main(int argc,char **argv) : { : TypeA A; : A.cells.push_back(5); : cout << "The address of cells:"<<(&A.cells[0])<<endl; : A.cells.push_back(4); : cout << "The address of cells:"<<(&A.cells[0])<<endl; : return 0; : } : Output: : -----build TypeA----- : The address of cells:0x33cf0 : The address of cells:0x33d70 : -----delete TypeA----- : 從結果可以看出 push_back後 : 同樣都是vector的第一個element : 他的位址是會改變的 所以 STL 的書才會告訴你 iterator 會在 vector 做 push_back 後失效, 因為當 vector 的 capacity 不足且無法延伸出更大的連續空間時, vector 就需要來個大搬家。 不過你前一篇貼出的 code 怎麼看都沒有出現你這篇描述的問題。 : 如果是先把位址記下來 : 接下來作push_back : 再傳先前記下來的位址給function操作 : 可能就會對一個空掉的位址做動作 : 因此會出現segmentation fault或是glibc的錯誤訊息 : 因為是第一次寫STL的code 沒注意到push_back會有這樣的影響... : 請問如果要解決這個問題 有沒有比較好的作法呢? : 我現在只想到另外記cells的index值 再用cells[index]去做存取 : 另外 使用vector時 element要怎麼知道自己是第幾個element呢? pos = find(cells.begin(), cells.end(), element); if(pos != cells.end()) index = pos - cells.begin(); 這樣就能拿到 element 的 index, 不過如果你 cells 裡有多個元素有相同值, 那還得根據你的意圖再修改 code。 : 以上是我的心得 如果有錯請指正 我會非常感謝的!! -- Ling-hua Tseng (uranus@tinlans.org) Department of Computer Science, National Tsing-Hua University Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design Researching: Software pipelining for VLIW architectures Homepage: https://www.tinlans.org -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.108.191