stl容器,智能指针,正则表达式
(36条消息) C++智能指针_不爱学习的王小二的博客-CSDN博客
一、为什么需要智能指针
智能指针主要解决以下问题:
1、内存泄漏:内存手动释放,使用只能指针可以自动释放
malloc,free,new,delete
2、 共享所有权指针的传播和释放,比如一个对象多个位置使用
共享指针使用方法:
shared_ptr <Buffer> buf = make_shared<Buffer> ("auto free memory");
包含一个计数器,创建时计数器为1,当shared_ptr <Buffer> buf 2 = buf;时,计数器+1;共享指针 一般是先声明的后析构。
智能指针线程安全的问题:
ref count是安全的(原子技术),但指向对象数据,如果修改,是不安全的。如果要数据安全,还要自己加锁机制。
智能指针并不是数据的地址,需要使用 type *p = ptr.get();获取数据的地址。尽量不要使用get.
3 使用shared_ptr要注意的问题
a 不要用一个原始指针初始化多个shared_ptr
int *ptr = new int; shared_ptr <int> p1(ptr); shared_ptr <int> p2(ptr); //会出错,因为析构智能指针时,会将数据析构两次
b 不要在函数实参中创建shared_ptr
指针指针,本身是栈上的,先声明的后释放,
weak_ptr是与shared_ptr联合使用,不能单独使用
weal_ptr注意事项:
多线程环境下,共享指针赋值给weak_ptr,运行在单独的线程,使用数据时需要将资源锁住,lock之后use_count+1,有两种可能1、资源还在 2、资源已经释放,并可以将这种状态保持,即使原资源发生变化。然后判断资源存不存在
void f() { auto spt = gw.lock(); if(gw.expired()) { //然后判断资源存不存在 cout << "gw无效,资源已释放"; } else { cout << "gw有效, *spt = " << *spt << endl; } }
使用移动构造函数需要使用者手动将原对象清空。
如果等号右边对象是右值,则移动构造函数优先调用,如果没有移动构造函数,则调用拷贝构造函数。
move实质是强制转换,static_cast<type&&>(obj)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理