在STL中处理对象指针
STL的容器类是针对对象来进行存储管理的。虽然没有明确的限制不能在STL的容器类中包含指针,STL也不在乎您存放在容器中的对象还是指针。但仔细考虑STL的初衷,在容器类中使用指针是明显不合时宜的,而应该尽可能的直接将对象本身而不是将对象的指针放置在STL容器类中。直接在容器中存放指针一个最大的副作用就是可能导致内存泄漏。这个问题在char *类型上有突出的体现。
但某些时候,直接使用对象指针有明显的好处,这些情况大致可以概括为如下的几个方面:
- 当对象十分庞大时,频繁的拷贝复制所带来的系统资源消耗十分昂贵。
- 当您需要将同一个对象存放到多个容器中,这种情况应该不是很少见的。
- 当您需要在同一个容器中存放由同一个父类派生而来的多个派生类对象。这也很常见。
事实上,我这个星期所开发的计算程序中,正需要面对第三种情况。考虑使用STL的种种好处。我决定引入STL的list容器。 本来,使用BCB的TList对象,也可以实现同样的目的。但
- TLsit类在对象指针的个数超过5000个时,效率会有明显的下降。
- TList类不是类型安全的,它根本不在乎引入的对象指针是何种类型的。
引入TList类就意味着要包含VCL.h头文件,这对我的计算模块的可移植性实在不是一件好事。
我在做了决定之后,面临两个与stl有关的问题。
第一个问题就是上面提到的如何在STL中处理对象的指针。我的解决方法是创建一个封装指针的类,代码如下:
上述代码封装了一个指针。经过类PtrWrapper的封装后,您就没有必要直接使用指针了。STL容器接触的是真正的对象,只不过这个对象封装了一个特定类型的指针。下面举例说明PtrWrapper的使用。