[問題] 直接呼叫解構子

看板C_and_CPP (C/C++)作者 (卡)時間15年前 (2010/10/19 08:46), 編輯推噓3(3015)
留言18則, 5人參與, 最新討論串1/4 (看更多)
需求是這樣的: 1.有一 Class,是專門用來當作儲存的資料結構。 2.當程式運行中,要執行刪除功能時,一旦確定刪除某筆資料, 要保證儲存資料的那個Class其解構子功能要能馬上執行。 ---------------------------------------------------- 所以我的作法大概是像這樣: Class * A = new Class[5]; //將 A 指向有五筆CLASS的陣列 → 假設要刪除的是 A[3] 這筆資料 ← Class *temp = &A[3] ; //將 temp 指向 第四筆Class Delete temp ; 如此由Class解構子中的訊息得知,那解構子的確會被執行。 ------------------------------------------------------- 在執行時都是正確的數據,但是一旦我多做幾次新增資料、刪除, 就有可能出現當機的情況:程式崩潰不動、顯現亂碼的情況。 是否是這樣的方式不夠洽當嚴謹呢? 想請問是否有比較好的方式,可以直接呼叫特定某筆CLASS的解構子, 最好是可以呼叫位於Class陣列中 的特定一筆。(像是指定陣列中的 A[3] ) 感謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.45.36

10/19 09:01, , 1F
我會改用 vector 或 list 當作容器 會比較安全
10/19 09:01, 1F
這是因為需求指定不能用 vector 與 list …

10/19 09:02, , 2F
其實我覺得你用 new [] 不是搭配 delete [] 就很怪.....
10/19 09:02, 2F
因為我並不想重作整個Class陣列,希望能夠單獨刪除其中的一筆資料就好。

10/19 09:11, , 3F
那你內文中所謂新增資料的意思是...?
10/19 09:11, 3F
Class中有幾個成員 → int Phone ; 所謂的新增資料,其實就只是把資料填到裡面而已。 EX: A[0].setPhone("0123456789"); 通常在 Delete A[n] 後, 我會補上 &A[n] = new Member(); 但是不補上似乎也是正常,這邊我就不是很清楚 delete的實作方式了。 ※ 編輯: KanoLoa 來自: 122.116.45.36 (10/19 09:19)

10/19 09:36, , 4F
這樣混用 new [] 與 delete 跟 new 感覺就很容易出事..XD
10/19 09:36, 4F

10/19 09:38, , 5F
&A[n] = new Member(); 這行是沒有作用的...delete 就
10/19 09:38, 5F

10/19 09:39, , 6F
是還會呼叫每一個物件的解構子, 才來釋放記憶體, 你已
10/19 09:39, 6F

10/19 09:40, , 7F
經先刪掉的話, 它再呼叫就變成刪兩次
10/19 09:40, 7F

10/19 09:49, , 8F
謝謝 !!
10/19 09:49, 8F

10/19 09:54, , 9F
如果真的不得已要這樣做, 你可以參考std::Allocator
10/19 09:54, 9F

10/19 09:55, , 10F
需要在一塊記憶體上即地建構/摧毀物件的時候可以用到
10/19 09:55, 10F

10/19 09:56, , 11F
不過你要提供copy ctor, 另一個方法就是用replacement
10/19 09:56, 11F

10/19 09:56, , 12F
new, 跟 A[n].~Class() 來作, 不過都是需要非常小心就
10/19 09:56, 12F

10/19 09:56, , 13F
10/19 09:56, 13F

10/19 09:58, , 14F
如果變成這樣實在太慘了,甚至有本末倒置的感覺。
10/19 09:58, 14F

10/19 10:00, , 15F
所以其實我才不管什麼爛需求...只要我有理由說出他爛,
10/19 10:00, 15F

10/19 10:00, , 16F
打死我都不會照他的做
10/19 10:00, 16F

10/19 10:05, , 17F
嗯 我剛去抗議了,現在他應該很困擾 哈哈哈
10/19 10:05, 17F

10/19 10:09, , 18F
Allocator,第一次知道有這東西
10/19 10:09, 18F
文章代碼(AID): #1ClEfsfb (C_and_CPP)
文章代碼(AID): #1ClEfsfb (C_and_CPP)