月落乌啼霜满天,江枫渔火对愁眠。 - 《枫桥夜泊 / 夜泊枫江》(张继)
回答重点
在C++中的智能指针利用RAII实现内存分配的管理,避免内存泄漏和其他与动态内存分配相关的问题。C++11中提供了三种主要的智能指针:std::unique_ptr
、std::shared_ptr
和std::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