
113
第
4
章
智能指针
诗人和作曲家往往对爱情情有独钟,有时又对计数偏爱有加,偶然也会把两者兼收并
蓄。伊丽莎白
·
巴雷特
·
勃朗宁(
Elizabeth Barrett Browning
)有诗云,“何以爱汝,待
我细数”(
How do I love thee? Let me count the ways
),保罗
·
西蒙(
Paul Simon
)
亦有绝唱,“逃离爱娇娃,必有五十法”(
There must be 50 ways to leave your
lover
),受此启发,我们也来把对于裸指针实在爱不起来的理由一一列举。
1.
裸指针在声明中并没有指出,裸指针指涉到的是单个对象还是一个数组。
2.
裸指针在声明中也没有提示在使用完指涉的对象以后,是否需要析构它。换言之,
你从声明中看不出来指针是否拥有(
own
)其指涉的对象。
3.
即使知道需要析构指针所指涉的对象,也不可能知道如何析构才是适当的。是应
该使用
delete
运算符呢,还是别有它途(例如,可能需要把指针传入一个专门的、
用于析构的函数)?
4.
即使知道了应该使用
delete
运算符,参见理由
1
,还是会发生到底应该用单个对
象形式(“
delete
”)还是数组形式(“
delete[]
”)的疑问。一旦用错,就会导
致未定义行为。
5.
即启用够确信,指针拥有其指涉的对象,并且也确知应该如何析构,要保证析构
在所有代码路径上都仅执行一次(包括那些异常导致的路径)仍然困难重重。只
要少在一条路径上执行,就会导致资源泄漏。而如果析构在一条路径上执行了多
于一次,则会导致未定义行为。 ...