C++98中的替代物
1. auto_ptr<T>
它是unique_ptr的前身,对堆对象的管理方法与unique_ptr是一样的,但是允许直接赋值来转移所有权,不支持管理数组。
初始化:
auto_ptr<T> a(new T);
auto_ptr<T> c(new T);
转移所有权(赋值也会使得所有权转移,原指针失效,要特别注意这一点):
auto_ptr<T> b = a; // a会失效,b会获得对象的所有权(auto_ptr特有的方式,因容易误用,unique_ptr中被废弃)
auto_ptr<T> d(XXXXlease()); // c会失效,d会获得对象的所有权
可直接以指针语法使用:
b->func();
获取裸指针以传递(方法与unique_ptr相同):
T *nb = XXXXt(); // 获取裸指针
func2(nb); // 传递裸指针
为了避免误用赋值导致指针意外失效,可以将auto_ptr声明为const以阻止赋值操作:
const auto_ptr<T> f(new T); // 阻止赋值操作
const auto_ptr<T> g = f; // 编译错误
由于赋值会导致原指针失效,因此auto_ptr也不能用于STL容器或STL算法:
vector<auto_ptr<T>> vec1; // 错误的用法!!!
由于C++98并不支持模板的数组语法,因此auto_ptr不能包含数组。
否则数组会被delete删除,而不是被delete[]删除,只运行了数组第一个元素的析构函数,可能导致内存泄漏。
auto_ptr<T> h(new T[20]); // 错误的用法!!!
在C++98中,数组可以使用vector管理。
2. vector<T>
这个就不用说了吧,路人皆知的C++中数组的替代品,用法太多不可能一一列举,不知道怎么用的看C++ Primer吧。