前言
c++ 中new开辟的内存,离开作用域时需要手动释放,不然会造成内存泄露,因此, 如果将 new 返回的地址赋给智能指针, 将无需 记住 稍后 释放 这些 内存: 在 智能 指针 过期 时, 这些 内存 将 自动 被 释放。
什么是指针
auto_ptr
void TestAutoPtr() {
auto_ptr<String>s1(new String("dms"));
auto_ptr<String>s4;
s4 = s1;//可以但是后面使用s1会出现问题
//cout << *s1 << endl; //error:s1不再指向有效数据
}
int main()
{
TestAutoPtr();
}
在自定义String类析构函数中输出内容:
String::~String()
{
num_string--;
std::cout << "释放:" << *this << std::endl;
delete[] str;
}
运行结果如下
可以看到new出的内存被自动释放了,需要注意的是s1赋值给s4 时s1的权力将被剥夺,不再指向有效数据。
unique_ptr
void TestUniquePtr()
{
unique_ptr<String>s2(new String("uniquedd"));
unique_ptr<String>s3;
//s3 = s2; //非法操作
unique_ptr<String[]>s5(new String[5]); //允许数组
//auto_ptr<String[]>s6(new String[5]); //不允许数组
}
相较于auto_ptr,unique_ptr对于赋值操作为非法操作,防止犯错,而且unique_ptr支持数组而auto_ptr不支持。
shared_ptr
void TestSharedPtr() {
shared_ptr<String>s7(new String("share"));
shared_ptr<String>s8, s9;
s8 = s7;
s9 = s7;
cout << *s7 << " " << *s8 << " " << *s9 << endl;
shared_ptr<String[]>s10(new String[5]);
}
相比前两种智能指针,shared_ptr支持赋值操作也支持数组