如标题所示。这个问题可能已经有了答案,但我找不到答案。
答案 0 :(得分:23)
裸指针与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
答案 1 :(得分:19)
原始指针(至少通常)只是一个地址。你无法告诉它从指针本身指向 的内容。
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
被销毁,指针对象将保持存在,指针对象也是如此。< / p>
weak_ptr
表示对指针对象的非拥有访问。如果对象存在,它允许访问。如果对象已被销毁,它会告诉您指针对象不再存在,而不是试图访问被销毁的对象。