wordpress评论采集插件,搜索引擎优化的重要性,做外贸网站需要多少钱,百度站长平台工具使用指针时很容易出现内存泄漏#xff0c;便引入了智能指针#xff0c;c 11中主要有三类
std::unique_ptr#xff1a;独占资源指针#xff0c;同一时刻只能有一个指针指向同一个对象std::shared_ptr#xff1a;共享资源指针#xff0c;同一时刻可以有多个指针指向同一个…使用指针时很容易出现内存泄漏便引入了智能指针c 11中主要有三类
std::unique_ptr独占资源指针同一时刻只能有一个指针指向同一个对象std::shared_ptr共享资源指针同一时刻可以有多个指针指向同一个对象std::weak_ptr用来解决shared_ptr相互引用导致的死锁问题auto_ptr已经废弃
unique_ptr
头文件 #include memcpy 使用std::unique_ptr代替裸指针在离开作用域时自动释放内存 std::unique_ptr的引用计数始终为1其性能与裸指针几乎等同
初始化
unique_ptr是没有拷贝构造函数的只支持右值拷贝构造
// 直接初始化
std::unique_ptrint ptr(new int(3));// make_unqiue
// 注该方法是c 14才有的
std::unique_ptrint ptr std::make_uniqueint(3);// std::move
// 移动语义初始化(实际上移动语义和匿名对象初始化最终都是调用右值拷贝构造函数)
std::unique_ptrint ptr1(new int(1));
std::unique_ptrint ptr2 std::move(ptr1);// 还有一种错误初始化方式
std::unique_ptrint ptr1(new int(1));
std::unique_ptrint ptr2 ptr1; // 报错尝试应用已删除的函数
std::unique_ptrint ptr3(ptr1); // 报错左值拷贝构造并未实现成员函数 release() 释放调用后智能指针和其所指向对象的联系再无联系但是该内存仍然存在有效。它会返回裸指针但是该智能指针被置空。 返回的裸指针我们可以手工delete来释放也可以用来初始化另外一个智能指针或者给另外一个智能指针赋值。 std::unqiue_ptrint ptr1 std::make_uniqueint(1);
std::unique_ptrint ptr2(ptr1.release()); // 此时ptr1 nullptrreset() reset()不带参数情况释放智能指针所指向的对象(释放因为它是独占而不像shared_ptr还需要考虑引用计数)并将智能指针置空。 reset()带参数时释放智能指针所指向的对象并将该智能指针指向新对象. get() 返回智能指针中保存的裸指针 返回值裸指针与智能指针共同管理对象 swap() 交换两个对象的指向 unique_ptrstring ps1(new string(good luck));
unique_ptrstring ps2(new string(good luck2));
ps1.swap(ps2);
std::swap(ps1, ps2);//也可使用标准库的swap置空
release和reset均可以置空nullptr也可以置空class A
{
public:A(){std::cout init std::endl;}~A(){std::cout ~A std::endl;}
};std::unique_ptrA ptra std::make_uniqueA();
ptra nullptr;// out
// init
// ~Aunique_ptr转shared_ptr
使用std即可