C++基础面试题 | 介绍C++中三种智能指针的使用场景?

月落乌啼霜满天,江枫渔火对愁眠。 - 《枫桥夜泊 / 夜泊枫江》(张继)

回答重点

在C++中的智能指针利用RAII实现内存分配的管理,避免内存泄漏和其他与动态内存分配相关的问题。C++11中提供了三种主要的智能指针:std::unique_ptrstd::shared_ptrstd::weak_ptr

1. std::unique_ptr

std::unique_ptr是一种独占所有权的智能指针,意味着同一时间内只能有一个unique_ptr指向一个特定的对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。

  • 使用场景:当你需要独占一个资源时,即在任何时刻只有一个指针指向该资源。std::unique_ptr提供了独占所有权模型,这意味着它不允许复制(copy),但允许移动(move),这使得资源的所有权可以在智能指针之间转移,而不会有两个指针同时拥有同一个资源。
    -当你需要智能管理资源,如文件句柄和互斥锁时。
示例代码:
#include <iostream>
#include <memory>

class Test {
public:
    Test() { std::cout << "Test::Test()\n"; }
    ~Test() { std::cout << "Test::~Test()\n"; }
    void test() { std::cout << "Test::test()\n"; }
};

int main() {
    std::unique_ptr<Test> ptr(new Test());
    ptr->test();
    // 当ptr离开作用域时, 它指向的对象会被自动销毁
    return 0;
}

2. std::shared_ptr

std::shared_ptr是一种共享所有权的智能指针,多个shared_ptr可以指向同一个对象。内部使用引用计数来确保只有当最后一个指向对象的shared_ptr被销毁时,对象才会被销毁。

  • 使用场景:当你需要多个指针共享同一个资源时,std::shared_ptr通过引用计数来管理资源的生命周期。每个std::shared_ptr实例都会持有一个计数器的引用,当最后一个std::shared_ptr被销毁时,资源会被释放。
  • 适用情况:当你的对象需要在多个持有者之间共享,或者当你不确定对象的生命周期应该由谁来管理时,std::shared_ptr是合适的。例如,在一个复杂的对象图中,多个对象可能需要引用同一个资源。
示例代码:
#include <iostream>
#include <memory>

class Test {
public:
    Test() { std::cout << "Test::Test()\n"; }
    ~Test() { std::cout << "Test::~Test()\n"; }
    void test() { std::cout << "Test::test()\n"; }
};

int main() {
    std::shared_ptr<Test> ptr1(new Test());
    std::shared_ptr<Test> ptr2 = ptr1;
    ptr1->test();
    // 当ptr1和ptr2离开作用域时,它们指向的对象会被自动销毁
    return 0;
}

3. std::weak_ptr

std::weak_ptr是一种不控制对象生命周期的智能指针,它用来观察std::shared_ptr管理的对象,而不会改变对象的引用计数。std::weak_ptr通常与std::shared_ptr一起使用,以解决强引用循环的问题。

使用场景:

  • 当你需要访问但不拥有由shared_ptr管理的对象时。
  • 当你需要解决shared_ptr之间的循环引用问题时。

注意:weak_ptr肯定要和 shared_ptr一起使用。

示例代码:

#include <iostream>
#include <memory>

class Test {
public:
    Test() { std::cout << "Test::Test()\n"; }
    ~Test() { std::cout << "Test::~Test()\n"; }
    void test() { std::cout << "Test::test()\n"; }
};

int main() {
    std::shared_ptr<Test> sharedPtr(new Test());
    std::weak_ptr<Test> weakPtr = sharedPtr;
    if (auto lockedSharedPtr = weakPtr.lock()) {
        lockedSharedPtr->test();
    }
    // 当sharedPtr离开作用域时,它指向的对象会被自动销毁
    return 0;
}

更多信息:
https://blog.csdn.net/LiHongyu05/article/details/141184973

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值