[問題] 如何增大vector大小???

看板C_and_CPP (C/C++)作者 (我愛阿蓉)時間16年前 (2010/01/15 18:24), 編輯推噓0(0038)
留言38則, 2人參與, 最新討論串1/1
是這樣的 我當然知道使用push_back可以增加大小 不過我目前類似需要這樣的邏輯 class Foo { public: Foo(){} int *x; } vector<Foo> v; for(i=0;i<5;i++) { Foo *temp=new Foo; v.push_back(*temp); delete temp; } 以上我發現幾個我觀念上嚴重的問題就是 我認知上雖然他copy一份 可是 1.如果我在Foo裡面加了一個 void operator = (Foo a){cout<<"copy"<<endl;} 沒有印東西出來 , 讓我不禁懷疑他是不是copy 而我自己想寫個copy constructor去攔截 也無法 他跑出 no copy constructor available or copy constructor is declared 'explicit 超詭異 另一個觀念大問題就是 2.我去delete temp了 而temp->x 和 v[0]->x 指向同一塊記憶體 如果我在Foo的dstr 去 delete x; 那一定會有問題~~ 但我現在沒有寫 這樣是不是安全的? 雖然delete temp 可是他不會釋放x.... 3. 我範例上的邏輯是想要動態增加一些Foo instance 但想來想去就我這種寫法 而我曾經看板上某大有說 不要再vecotr<紀錄指標> 比較好 但如果不記錄指標 ~如果需要動態長instance 如同我範例的x 他是一個指標 class裡面只要有指標 似乎就必須幫她寫operator= 和 copy cstr... 我知道他應該是發生shallow copy 可是我攔截不到他 operator=這個行為... 該怎麼辦 變成只要class裡面有pointer 我就不能夠用這種方式增大vector? 請問正統的寫法該如何做到呢? 4. 我加了destructor int main() { vector<Foo> q; Foo *p; p=new A; p->x=new int(5566); q.push_back(*p); return 0; } 這幾行我發現他會呼叫兩次destructor 我怎麼覺得頂多q[0]他自己會去解構 另一個我沒delete阿 哪跑來的?? 5. 因為最近有再碰win32 是不是該把hdc hwnd之類的都想成pointer去傳遞呢? 因為遇到一個怪問題(class裡面有包hdc...)才衍生上面一堆問題... 找不到bug = = 請教各位 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222 ※ 編輯: QQ29 來自: 219.87.64.222 (01/15 18:40)

01/15 18:38, , 1F
你必須同時定義 copy ctor/assigment,不然這種
01/15 18:38, 1F

01/15 18:38, , 2F
data member 有放 pointer,dtor 又可能 delete 它的,
01/15 18:38, 2F

01/15 18:38, , 3F
塞進 vector 死掉的機率幾乎接近 100%。
01/15 18:38, 3F

01/15 18:39, , 4F
你的 1. 是少了 copy ctor 吧,必須複製 x 指向的資料再
01/15 18:39, 4F

01/15 18:40, , 5F
new 一份就行了,這常造成效能問題,所以 C++0x 多了一個
01/15 18:40, 5F

01/15 18:40, , 6F
叫 move ctor 的東西,允許你直接做 pointer 轉移。
01/15 18:40, 6F

01/15 18:41, , 7F
t大我又稍微修改了一下文章@@ 不過我copy constructor寫不出
01/15 18:41, 7F

01/15 18:41, , 8F
至於 1. 最後的 err msg 我覺得是 code 寫錯。
01/15 18:41, 8F

01/15 18:42, , 9F
class 定義式裡放一個 Foo(const Foo &rhs) { ... }
01/15 18:42, 9F

01/15 18:43, , 10F
還有你標題會讓我想直接會 resize XD
01/15 18:43, 10F

01/15 18:43, , 11F
直接回 resize
01/15 18:43, 11F

01/15 18:45, , 12F
其實我沒遇到這問題很久了,因為我都放 shared_ptr 在
01/15 18:45, 12F

01/15 18:45, , 13F
data member 裡,這樣它自己會處理好。
01/15 18:45, 13F

01/15 18:45, , 14F
copy ctor 寫不出一定是 code 有問題,程式看仔細點。
01/15 18:45, 14F

01/15 18:46, , 15F
t大我發現 加了const才給我過耶 opt= 和copy cstr都加
01/15 18:46, 15F

01/15 18:46, , 16F
原因讓我想不透 他會自己把vecotr push的轉const?
01/15 18:46, 16F

01/15 18:49, , 17F
不意外吧,vector::push_back() 的 signature 一直都是
01/15 18:49, 17F

01/15 18:49, , 18F
void push_back(const T&);
01/15 18:49, 18F

01/15 18:50, , 19F
反正放 const 就對了,是不是 const 都能接收。
01/15 18:50, 19F

01/15 19:04, , 20F
謝謝T大 可否請教其他問題@@ 因為他destructor行為好怪
01/15 19:04, 20F

01/15 19:12, , 21F
4. 的問題我沒辦法在自己環境 repeat,理論上是一個 dtor
01/15 19:12, 21F

01/15 19:12, , 22F
都不會被呼叫,除非你有 global object。
01/15 19:12, 22F

01/15 19:29, , 23F
@@為什麼不會被呼叫呢 程式結束return 0不是感覺至少會去
01/15 19:29, 23F

01/15 19:30, , 24F
清掉 q[0]這個 instance A嗎?
01/15 19:30, 24F

01/16 00:56, , 25F
你的 main() 是不是有少貼 code?
01/16 00:56, 25F

01/16 01:35, , 26F
= = 對....我改一下
01/16 01:35, 26F

01/16 01:36, , 27F

01/16 01:37, , 28F
我其實上述的x 真正code是寫一個hdc 但我不會複製hdc....
01/16 01:37, 28F

01/16 01:39, , 29F
是不是不該去複製hdc呢?
01/16 01:39, 29F
※ 編輯: QQ29 來自: 123.192.73.81 (01/16 01:39)

01/16 01:40, , 30F
因為我今天發現 我for裡面new一個instance delete後
01/16 01:40, 30F

01/16 01:40, , 31F
下一次new的竟然是同一塊....這樣便成他們都指向同一個x
01/16 01:40, 31F

01/16 01:42, , 32F
這個x 我真正code裡面是 一個用CreateCompatibleDC拿到的hdc
01/16 01:42, 32F

01/17 04:18, , 33F
你的 code 在我的環境也是解構一次而已。
01/17 04:18, 33F

01/17 10:53, , 34F
是應該說vector實作方式不一樣嗎? 感覺它裡面有一個複製的動
01/17 10:53, 34F

01/17 10:53, , 35F
01/17 10:53, 35F

01/17 10:53, , 36F
應該說 有一個暫存的變數
01/17 10:53, 36F

01/17 15:56, , 37F
其實倒是不用太擔心實作,反正程式寫到解構幾次都能正常
01/17 15:56, 37F

01/17 15:56, , 38F
work 就好了。
01/17 15:56, 38F
文章代碼(AID): #1BK49o9l (C_and_CPP)
文章代碼(AID): #1BK49o9l (C_and_CPP)