C++智能指针shared_ptr(c++智能指针面试题)

C++智能指针shared_ptr(c++智能指针面试题)

编码文章call10242025-05-08 11:55:384A+A-

std::shared_ptr 是 C++ 标准库中的一个智能指针,它利用引用计数来实现共享式拥有的概念。下面为你详细介绍 std::shared_ptr、std::weak_ptr、std::bad_weak_ptr 和
std::enable_shared_from_this。

std::shared_ptr

std::shared_ptr 是一种智能指针,它能够记录有多少个 std::shared_ptr 共同指向一个对象。当最后一个指向该对象的 std::shared_ptr 被销毁时,这个对象就会被自动释放。

示例代码

cpp

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructor" << std::endl; }
    ~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};

int main() {
    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
    std::cout << "ptr1 use count: " << ptr1.use_count() << std::endl;

    std::shared_ptr<MyClass> ptr2 = ptr1;
    std::cout << "ptr1 use count: " << ptr1.use_count() << std::endl;
    std::cout << "ptr2 use count: " << ptr2.use_count() << std::endl;

    return 0;
}

在上述代码中,std::make_shared 用于创建一个 std::shared_ptr 对象,use_count() 方法用于返回当前有多少个 std::shared_ptr 指向同一个对象。当 ptr1 和 ptr2 超出作用域时,由于它们是最后指向 MyClass 对象的 std::shared_ptr,所以 MyClass 对象会被自动销毁。

std::weak_ptr

std::weak_ptr 是一种不控制对象生命周期的智能指针,它是对 std::shared_ptr 管理对象的一种弱引用。std::weak_ptr 主要用于解决 std::shared_ptr 的循环引用问题。

示例代码

cpp

#include <iostream>
#include <memory>

class B;

class A {
public:
    std::shared_ptr<B> b_ptr;
    ~A() { std::cout << "A destructor" << std::endl; }
};

class B {
public:
    std::weak_ptr<A> a_ptr;  // 使用 std::weak_ptr 避免循环引用
    ~B() { std::cout << "B destructor" << std::endl; }
};

int main() {
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();

    a->b_ptr = b;
    b->a_ptr = a;

    return 0;
}

在这个例子中,如果 B 类中的 a_ptr 也是 std::shared_ptr,就会形成循环引用,导致 A 和 B 对象无法被正确销毁。使用 std::weak_ptr 可以避免这种情况,因为 std::weak_ptr 不会增加引用计数。

std::bad_weak_ptr

std::bad_weak_ptr 是一个异常类,当从一个已经过期的 std::weak_ptr 创建 std::shared_ptr 时,会抛出该异常。

示例代码

cpp

#include <iostream>
#include <memory>

int main() {
    std::weak_ptr<int> weak;
    try {
        std::shared_ptr<int> shared = weak.lock();  // 尝试从空的 std::weak_ptr 创建 std::shared_ptr
    } catch (const std::bad_weak_ptr& e) {
        std::cout << "Caught bad_weak_ptr exception: " << e.what() << std::endl;
    }
    return 0;
}

std::enable_shared_from_this


std::enable_shared_from_this 是一个模板类,用于让一个对象能够安全地获取指向自身的 std::shared_ptr。

示例代码

cpp

#include <iostream>
#include <memory>

class MyClass : public std::enable_shared_from_this<MyClass> {
public:
    std::shared_ptr<MyClass> getShared() {
        return shared_from_this();
    }
    ~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};

int main() {
    std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>();
    std::shared_ptr<MyClass> anotherPtr = ptr->getShared();
    std::cout << "ptr use count: " << ptr.use_count() << std::endl;
    std::cout << "anotherPtr use count: " << anotherPtr.use_count() << std::endl;

    return 0;
}

在这个例子中,MyClass 继承自
std::enable_shared_from_this<MyClass>,通过 shared_from_this() 方法可以安全地获取指向自身的 std::shared_ptr。

综上所述,std::shared_ptr 提供了共享式拥有的功能,std::weak_ptr 用于解决循环引用问题,std::bad_weak_ptr 用于处理异常情况,
std::enable_shared_from_this 用于让对象安全地获取自身的 std::shared_ptr。这些工具共同构成了 C++ 中强大的智能指针体系。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4