看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《aecho (星空下的鮪魚)》之銘言: : 推 littleshan:別在 vector 中放 TYPE*,除非你真的知道這樣做的代價 02/21 11:18 : → littleshan:真要放指標,可以用 smart_ptr 02/21 11:19 : 想說還是回文好了 : 如果在vector裡不放TYPE*的話,要放什麼呢? : 不是很懂不放TYPE*的理由。不知道是否能解釋一下呢? new 出來的物件要用 delete 回收,這點大家都知道, 但對於放在 vector 中的一堆指標要進行回收時,如果 你只是跑一個 for loop 去 delete,那就很危險了。 因為: 1. 你必須保證同其中沒有重覆的指標指向相同物件 重覆 delete 一個物件是場悲劇。 2. 你必須保證 vector 的操作過程中,若有指標被移出 vector 時,會去呼叫 delete 進行回收,否則會產 生 memory leak。 3. 當你進行 delete 時,必需確定 vector 中的所有指 標不會在其它資料結構中用到。否則使用一塊已經被 delete 回收的記憶體空間,同樣是個悲劇。 當你在 vector 中存指標而非物件本身時,我想最主要的 原因應該是搬移/指涉的效率會比較好,既然有這些操作, 要保持以上三點就變得不太容易。因此若要放指標,最好 改用 boost 的 smart_ptr。 http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/smart_ptr.htm smart_ptr 目前是 C++ TR1 中的一個項目,會在下一版 C++ 中成為標準。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.115.151.34
james732:下一版的C++什麼時候會現世呢? 02/23 01:19
chrisdar:VC++2008 有內建一些TR1 包含regexp 02/23 01:22
chrisdar:正確的來說 是 Visual C++ 2008 SP1 02/23 01:23
xam:這幾點都跟用指標陣列會遇到的問題一樣啊.. 02/23 01:29
tinlans:通常會把 pointer 包到 vector 裡,這種 vector 大都會被 02/23 01:58
tinlans:封裝成某個 class 的 data member 了,destructor 有寫好 02/23 01:58
tinlans:就不會出事,怕就怕有些人太懶不封裝。 02/23 01:59
aecho:感恩 好詳盡的回答~~ <(_._)> 02/23 08:08