您的位置:首页 > 文旅 > 旅游 > C++基础面试题 | 介绍C++中三种智能指针的使用场景?

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

2025/1/2 0:50:18 来源:https://blog.csdn.net/LiHongyu05/article/details/141783675  浏览:    关键词: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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com