C++智能指针shared_ptr(c++智能指针面试题)
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++ 中强大的智能指针体系。