作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] 想请教一下 vector 的生命期
时间Mon Feb 23 01:12:18 2009
※ 引述《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
1F:→ james732:下一版的C++什麽时候会现世呢? 02/23 01:19
2F:推 chrisdar:VC++2008 有内建一些TR1 包含regexp 02/23 01:22
3F:→ chrisdar:正确的来说 是 Visual C++ 2008 SP1 02/23 01:23
4F:→ xam:这几点都跟用指标阵列会遇到的问题一样啊.. 02/23 01:29
5F:推 tinlans:通常会把 pointer 包到 vector 里,这种 vector 大都会被 02/23 01:58
6F:→ tinlans:封装成某个 class 的 data member 了,destructor 有写好 02/23 01:58
7F:→ tinlans:就不会出事,怕就怕有些人太懒不封装。 02/23 01:59
8F:推 aecho:感恩 好详尽的回答~~ <(_._)> 02/23 08:08