【发布时间】:2014-08-13 17:31:08
【问题描述】:
我有一个 std::weak_ptr。在尝试使用底层对象之前,我将其锁定以获取 shared_ptr:
auto foo_sharedptr = foo_weakptr.lock();
if (foo_sharedptr != nullptr)
{
// do stuff with foo
}
通常这可以正常工作。但是,有时我在调用 lock 期间遇到访问冲突:
Unhandled exception at 0x00007FF91F411BC3 (My.dll) in My.exe:
0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
我的猜测是底层指针已经被删除了,但是我对weak_ptr的理解是,在这种情况下,lock应该返回一个nullptr。我在滥用类型吗?如果没有,我应该如何进行调试?
【问题讨论】:
-
不回答为什么会发生访问冲突,但你可以使用
foo_weakptr.expired() -
如果你看boost.org/doc/libs/1_36_0/boost/weak_ptr.hpp,有一个关于访问冲突的注释,有关系吗?
-
@Appleshell,规范声明 expired() 被 lock() 有效调用:“有效返回 expired() ? shared_ptr
() : shared_ptr (*this), 执行原子地。” -
@BlueTrin 我认为他们在这里所说的是他们不使用的 ctor 可能会导致访问冲突。我没有使用 Boost,所以也许我的实现有这个问题。我希望不是!谢谢。
-
我猜你已经破坏了
foo_weakptr,用全1位覆盖它,所以共享计数器对象的访问失败。您需要在实际的错误指令之前查看机器代码,以查看它从哪里获得 0xff..ff 地址
标签: c++ c++11 access-violation unhandled-exception weak-ptr