背景
写了个小程序有内存泄漏,一查果然又是new了之后忘记delete。C++11都出来那么久了,要习惯用智能指针取代常规的new和delete来避免这种低级错误。代码看上去也会更加简洁。
- 原来的指针用法
int *indexesNotMatched = new int[n];
for (int j=0;j<n;j++)
{
indexesNotMatched[j] = j;
}
....
- 修改为智能指针--new初始化指针的用法
//声明一个int指针并初始化指针指向的值为n,不是申请长度
shared_ptr<int> indexesNotMatched(new int(n));
//以下用法代替new,其他操作不变
unique_ptr<int[]> indexesNotMatched(new int[n]);
- 修改为智能指针--make_unique初始化的用法,C++14后可以使用
//初始化一个大小为n的int指针数组,用make_unique的情况下,小括号是指明size不是赋值,要跟new用法区分开
unique_ptr<int[]> indexesNotMatched = make_unique<int[]>(n);
//unique_ptr<int[]>改为auto也可以,简化代码
auto indexesNotMatched = make_unique<int[]>(n);
- shared_ptr在C++11的条件下还不支持下标操作,只有unique_ptr支持,C++17下两者都可以,如果C++11下要用shared_ptr实现数组指针,可以参考下面链接的代码
C++智能指针如何指向数组
智能指针中make_xxx函数和new的使用
https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/
智能指针做函数返回值
unique_ptr<float[]> ComputeLowerBound()
{
auto SAT = make_unique<float[]>(n);
....
return SAT;
}