杭州低价做网站,做设计找素材的 网站有哪些,wordpress怎么缩进,阳江公司做网站c11智能指针 shared_ptr介绍注意事项示例解决方案 weak_ptr特点示例 unique_ptr特点示例 shared_ptr
介绍
shared_ptr 是一种智能指针#xff0c;用于自动管理动态分配的对象的生命周期。它通过引用计数机制来确保当最后一个 shared_ptr 指向一个对象时#xff0c;该对象会… c11智能指针 shared_ptr介绍注意事项示例解决方案 weak_ptr特点示例 unique_ptr特点示例 shared_ptr
介绍
shared_ptr 是一种智能指针用于自动管理动态分配的对象的生命周期。它通过引用计数机制来确保当最后一个 shared_ptr 指向一个对象时该对象会被自动销毁。
注意事项
当两个或多个 shared_ptr 实例相互引用时会形成一个环形引用导致引用计数永远不会达到零从而引起内存泄漏。
示例
#include memory
#include iostreamclass B; // 前向声明class A {
public:std::shared_ptrB b_ptr;~A() {std::cout A destructor called std::endl;}
};class B {
public:std::shared_ptrA a_ptr;~B() {std::cout B destructor called std::endl;}
};int main() {std::shared_ptrA a std::make_sharedA();std::shared_ptrB b std::make_sharedB();a-b_ptr b;b-a_ptr a;return 0;
}在这个例子中A 的实例持有 B 的一个 shared_ptr而 B 的实例也持有 A 的一个 shared_ptr。这导致它们的引用计数永远不会降到零因此它们的析构函数永远不会被调用从而造成内存泄漏。
解决方案
使用 std::weak_ptr std::weak_ptr 是一种智能指针它不会增加对象的引用计数。它设计用来解决 shared_ptr 的环形引用问题。你可以将其中一个对象的 shared_ptr 替换为 weak_ptr 来避免环形引用
#include memory
#include iostreamclass B; // 前向声明class A {
public:std::weak_ptrB b_ptr; // 使用 weak_ptr 替代 shared_ptr~A() {std::cout A destructor called std::endl;}
};class B {
public:std::shared_ptrA a_ptr;~B() {std::cout B destructor called std::endl;}
};int main() {std::shared_ptrA a std::make_sharedA();std::shared_ptrB b std::make_sharedB();a-b_ptr b;b-a_ptr a;return 0;
}在这个修改后的例子中A 类使用 std::weak_ptr 来引用 B 类的实例。这样A 对 B 的引用不会增加 B 的引用计数。因此当 main 函数结束时a 和 b 的引用计数都会降到零它们所指向的对象将被正确销毁从而避免了内存泄漏。
weak_ptr
weak_ptr 是一种智能指针用于观察 std::shared_ptr 所管理的对象但不拥有该对象。std::weak_ptr 不会增加对象的引用计数因此不会影响对象的生命周期。它主要用于解决 std::shared_ptr 的环形引用问题。
特点
不拥有对象只是观察者。用于监视 std::shared_ptr但不影响其引用计数。可以从 std::weak_ptr 创建 std::shared_ptr 来访问对象如果对象还存在。
示例
#include iostream
#include memoryclass Widget {
public:Widget() { std::cout Widget constructed\n; }~Widget() { std::cout Widget destroyed\n; }
};int main() {std::shared_ptrWidget sharedPtr std::make_sharedWidget();std::weak_ptrWidget weakPtr sharedPtr;std::cout Shared count: sharedPtr.use_count() std::endl; // 输出 1if (auto tempSharedPtr weakPtr.lock()) { // 尝试从 weak_ptr 获取 shared_ptrstd::cout Object is alive\n;} else {std::cout Object is destroyed\n;}sharedPtr.reset(); // 释放 shared_ptr 所有权if (auto tempSharedPtr weakPtr.lock()) { // 再次尝试获取std::cout Object is alive\n;} else {std::cout Object is destroyed\n; // 此时输出}return 0;
}unique_ptr
unique_ptr 是一种智能指针它提供对单一对象的独占所有权。这意味着 std::unique_ptr 实例拥有它所指向的对象并且不允许复制该智能指针只允许移动。当 std::unique_ptr 被销毁时它所指向的对象也会被自动销毁。
特点
独占所有权模型。不支持复制只支持移动。自动释放所拥有的资源。轻量级开销小。
示例
#include iostream
#include memoryclass Widget {
public:Widget() { std::cout Widget constructed\n; }~Widget() { std::cout Widget destroyed\n; }
};int main() {std::unique_ptrWidget widgetPtr std::make_uniqueWidget();// std::unique_ptrWidget anotherPtr widgetPtr; // 编译错误不能复制std::unique_ptrWidget movedPtr std::move(widgetPtr); // 移动是允许的return 0;
}