【发布时间】:2013-05-21 13:15:11
【问题描述】:
如标题。这个问题可能已经有了答案,但我没有找到答案。
【问题讨论】:
-
你可以检查一个weak_ptr是否指向有效的东西。你不能用原始指针来做到这一点。
-
如果您查看here 并亲自查看所有差异可能会更好。没有一个区别,有很多。
标签: c++ weak-ptr raw-pointer
如标题。这个问题可能已经有了答案,但我没有找到答案。
【问题讨论】:
标签: c++ weak-ptr raw-pointer
裸指针和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
【讨论】:
原始指针(至少通常)只是一个地址。你无法从指针本身告诉任何关于它在 at 处所指向的内容。
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 存在,pointee 对象就会一直存在,但是一旦该对象的最后一个 shared_ptr 被销毁,pointee 对象也将被销毁。
weak_ptr 表示对指针对象的非拥有访问。如果对象存在,它允许访问。如果对象已被销毁,它会告诉您指针对象不再存在,而不是尝试访问被销毁的对象。
【讨论】: