C++智能指针


智能指针在头文件 memory的 std 命名空间中定义。

  • shared_ptr:允许多个指针指向同一个对象
  • unique_ptr:独占所指向的对象
  • weak_ptr:指向shared_ptr所管理的对象,弱引用(不计数)
  • auto_ptr:弃用

shared_ptr

void test_shared_ptr(){
    shared_ptr<int> sp = make_shared<int>(5);  //返回一个shared_ptr,指向一个动态分配的int对象

    shared_ptr<int> s_sp(new int(10)); //可以用new返回的指针初始化智能指针
    s_sp.reset(); //引用计数减一,如果减到了0就释放
    cout<<s_sp.use_count()<<endl; //输出:0
    // s_sp.reset(new int(15));  //原有对象计数减一,指向新的对象
    // s_sp.reset(new int(15), my_delete); //指定删除器

    //智能指针的构造函数是explicit的,因此不能自动类型转换,需要显式转换

    auto cp = sp;  //复制,引用计数加1

    //shared_ptr<int> c_cp(sp); //复制

    cout<<"cp.use_count():"<<cp.use_count()<<endl; //返回共享对象的智能指针数量,可能较慢,用于debug,这里输出2
    if(cp.unique()){  //use_count()是否为1
        cout<<"just one!"<<endl;
    }
    int *ip = sp.get(); //得到原始指针;尤其小心对原始指针进行操作,不要delete
    cout<<*ip<<" "<<*sp<<endl;  //智能指针也有*运算符
    shared_ptr<int> another_sp = make_shared<int>(10);
    swap(another_sp, sp); //swap
    sp.swap(another_sp); //swap again

}
void end_connection(connection *p){
    disconnect(*p);
}
void f(server &s){
    connection c = connect(&s);
    shared_ptr<connection> p(&c, end_connection); //如果管理的不是new来的资源,要自己指定删除器
    //当f退出的时候,会自动调用删除器关闭connection
}

unique_ptr

拥有其指向的对象,只能有一个unique_ptr指向给定的对象,不支持拷贝和赋值

void test_unique_ptr(){
    unique_ptr<int> u(new int(10));
    int *p = u.release(); //u放弃指向的对象,返回对象的指针,并将u置空
    cout<<*p<<endl;
    u.reset(p); //令u指向这个对象
    cout<<*u<<endl;
    u.reset(); //置空
    u.reset(nullptr); //置空

    //unique_ptr虽然没有拷贝构造函数和拷贝赋值运算符,不过有移动构造函数和移动赋值运算符
    //因此可以移动一个将要被销毁的unique_ptr,如返回一个局部对象的拷贝
}
/*
struct connection;
void end_connection(connection *p){
    disconnect(*p);
}
void f(server &s){
    connection c = connect(&s);
    //注意与shared_pre不同,unique_ptr需要指定模板参数,而decltype(function)返回一个函数类型,加上*号指出使用该类型的一个指针
    unique_ptr<connection, decltype(end_connection)*> p(&c, end_connection); //如果管理的不是new来的资源,要自己指定删除器
    //当f退出的时候,会自动调用删除器关闭connection
}
*/

weak_ptr

不控制所指对象的生存周期,一旦最后一个指向对象的shared_ptr被销毁,对象就会释放

void test_weak_ptr(){
    shared_ptr<int> sp(new int(5));
    weak_ptr<int> wp(sp); 
    auto w = wp; 
    wp.reset(); //将wp置空
    cout<<w.use_count()<<endl; //与w共享的shared_ptr数量,这里输出1
    if(w.expired()){ //如果w.use_count()返回0,则为true
        cout<<"w.use_count() == 0\n";
    }
    shared_ptr<int> temp = w.lock(); //得到w指向的对象的shared_ptr指针,这里引用计数会加1
    cout<<temp.use_count()<<endl; //输出2
    if(auto x = w.lock()){ 
        cout<<x.use_count()<<endl; //输出3
    } //x释放
    cout<<temp.use_count()<<endl; //输出2
}

循环引用

https://blog.csdn.net/daniel_ustc/article/details/23096229#t2

#include <iostream>
#include <memory>
using namespace std;
 
class B;
class A{
public:// 为了省去一些步骤这里 数据成员也声明为public
    //weak_ptr<B> pb;
    shared_ptr<B> pb;
    void doSomthing(){
//        if(pb.lock())
//        {
//
//        }
    }
 
    ~A(){
        cout << "kill A\n";
    }
};
 
class B{
public:
    //weak_ptr<A> pa;
    shared_ptr<A> pa;
    ~B(){
        cout <<"kill B\n";
    }
};
 
int main(int argc, char** argv){
    shared_ptr<A> sa(new A());
    shared_ptr<B> sb(new B());
    if(sa && sb){
        sa->pb=sb;
        sb->pa=sa;
    }
    cout<<"sa use count:"<<sa.use_count()<<endl;
    return 0;
}
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值