如题。这个问题可能已经有答案,但我未能找到。
如题。这个问题可能已经有答案,但我未能找到。
裸指针和 weak_ptr
的基本概念差异在于,如果所指向的对象被销毁,裸指针不会告诉你这一点。这被称为悬空指针:指向不存在对象的指针。通常很难追踪。
weak_ptr
会做到这一点。为了使用 weak_ptr
,必须先将其转换为 shared_ptr
。如果那个 shared_ptr
没有指向任何东西,那么对象已经被删除了。
例如:
#include <iostream>
#include <memory>
std::weak_ptr<int> wp;
void test()
{
auto spt = wp.lock(); // Has to be copied into a shared_ptr before usage
if (spt) {
std::cout << *spt << "\n";
} else {
std::cout << "wp is expired\n";
}
}
int main()
{
{
auto sp = std::make_shared<int>(42);
wp = sp;
test();
}
test();
}
输出
42
wp is expired
原始指针通常只是一个地址,你无法从指针本身了解它所指向的内容。
weak_ptr
总是与 shared_ptr
相关联,因此我们可能需要从 shared_ptr
开始才能理解 weak_ptr
。
shared_ptr
是具有引用计数功能的,因此它会跟踪到当前对象存在多少个引用(指针),并在没有指向该对象的引用时自动销毁对象。
如前所述,weak_ptr
与 shared_ptr
相关联。与 shared_ptr
不同的是,weak_ptr
的存在不会增加指向对象的引用计数。要使用 weak_ptr
,您必须首先将其转换为 shared_ptr
。如果当前引用计数为正,则转换成功,并且转换 weak_ptr
到 shared_ptr
将增加引用计数以表明已经将转换指针作为实际对象的引用。如果引用计数已经为零(表示指向对象的指针已被销毁),则尝试将 weak_ptr
转换为 shared_ptr
将简单失败。
shared_ptr
表示对指向对象的共享所有权。只要至少存在一个 shared_ptr
指向该对象,指向的对象就会一直存在,但是一旦最后一个指向该对象的 shared_ptr
被销毁,指向的对象也将被销毁。
weak_ptr
表示对指向对象的非所有权访问。它允许在对象存在时访问该对象。如果对象已被销毁,则告诉您指向的对象不再存在,而不是尝试访问已销毁的对象。