3.3.3 使用建议
scoped_array没有给程序增加额外的负担,用起来很方便轻巧。它的速度与原始数组同样快,很适合那些习惯于用new操作符在堆上分配内存的程序员。但scoped_array的功能很有限,不能动态增长,也没有迭代器支持,不能搭配STL算法,仅有一个纯粹的"裸"数组接口。而且,我们应当尽量避免使用new[]操作符,它比new更可怕,是许多错误的来源,因为
- int *p = new int[10];
- delete p;
这样的代码完全可以通过编译,无论是编译器还是程序员都很难区分出new[]和new分配的空间,而错误地运用delete将导致资源异常。
在需要动态数组的情况下我们应该使用std::vector,它比scoped_array提供了更多的灵活性,而只付出了很小的代价。使用std::vector,之前的例子可以写成:
- vector<int> sa(100, 5);
- sa[10] = sa[20] + sa[30];
很明显,std::vector只用一条语句就完成了scoped_array三条语句的初始化和赋值工作。因为vector有丰富的成员函数来操纵数据,能够使代码更加简单明了,易于维护。
除非对性能有非常苛刻的要求,或者编译器不支持标准库(比如某些嵌入式操作系统),否则本书不推荐使用scoped_array,它只是为了与老式C风格代码兼容而使用的类,它的出现往往意味着你的代码中存在着隐患。