acmilan作者
10年10个月前修改于 10年10个月前IP:山东
808390
1楼
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(c.release()); // c会失效,d会获得对象的所有权

可直接以指针语法使用:
b->func();

获取裸指针以传递(方法与unique_ptr相同):
T *nb = b.get(); // 获取裸指针
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吧。
评论
文号 / 808390

千古风流
名片发私信
学术分 4
总主题 466 帖总回复 2942 楼拥有证书:进士 学者 笔友
注册于 2009/05/30 21:22:42最后登录 2019/01/31 17:16:38
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:0

个人简介

暂未填写
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的