auto_ptr和unique_ptr用法学习

转自:https://blog.csdn.net/cpp_learner/article/details/118912592,chatgpt

1.auto_ptr存在的问题

  • 复制或者赋值都会改变资源的所有权;auto_ptr 的设计有一些缺陷,特别是其所有权转移语义(transfer of ownership)。当一个 auto_ptr 被赋值或拷贝时,所有权会从源对象转移到目标对象,这使得 auto_ptr 在容器和算法中使用时容易出错。
  • 不支持对象数组的内存管理;

2.unique_ptr介绍

  1. 基于排他所有权模式:两个指针不能指向同一个资源
  2. 无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造和赋值
  3. 保存指向某个对象的指针,当它本身离开作用域时会自动释放它指向的对象。
  4. 在容器中保存指针是安全的。
 {
    unique_ptr<string> p1(new string("I'm Li Ming!"));
    unique_ptr<string> p2(new string("I'm age 22."));
        
    cout << "p1:" << p1.get() << endl;// p1:0x192a070
    cout << "p2:" << p2.get() << endl;// p2:0x192a0a0

    // 报错: error: use of deleted function ‘std::unique_ptr,赋值运算符是delete的
    // p1 = p2;                    // 禁止左值赋值
    
    // 报错: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&)
    // 拷贝构造函数也是=delete的
    // unique_ptr<string> p3(p2);    // 禁止左值赋值构造

    unique_ptr<string> p3(std::move(p1));
    p1 = std::move(p2);    // 使用move把左值转成右值就可以赋值了,效果和auto_ptr赋值一样

    cout << "p1 = p2 赋值后:" << endl;
    cout << "p1:" << p1.get() << endl; // p1:0x192a0a0
    cout << "p2:" << p2.get() << endl; // p2:0
    cout<< "p3: " << p3.get()<<endl;// p3:0x192a070
    cout<<endl;
}

 

posted @ 2024-05-20 23:54  lypbendlf  阅读(19)  评论(0编辑  收藏  举报