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)

 

posted @ 2022-07-23 18:26  放弃吧  阅读(46)  评论(0编辑  收藏  举报