Microsoft Visual C++ 中的共享指针调试

Shared pointers debugging in Microsoft Visual C++

Microsoft Visual C++ 中是否有一种方法可以查看代码中引用共享指针的点?

例如:

class MyClass;
class MyDerClass : public MyClass;
boost::shared_ptr<MyClass> pmc1 = new MyClass;
boost::shared_ptr<MyClass> pmc2 = pmc1;
boost::shared_ptr<MyDerClass> pmc3 = pmc1;
...
delete pmc1;   // object still around until pmc2 and pmc3 are deleted

我能知道哪些指针(在源代码级别)仍然指向该对象吗?

我认为这是不可能的。您 可以 检查一个 shared_ptr 的引用计数以查看有多少对底层对象的引用是未完成的,但这并不是您所追求的。

为了知道 shared_ptr<T> 的哪些未完成实例指向同一个 T*,您需要扩充或重新实现 shared_ptr<> 来跟踪(大概只在调试中在静态全局线程安全映射中构建) 所有 shared_ptr<> 个实例。这并不能完全满足您的需求,但是如果您还向每个 shared_ptr<> 构造函数添加一个字符串("label")参数(可能使用 __FUNCTION__ 和一些宏化来进行上下文标记) ,你至少可以在某个时间点转储地图并回顾一下什么指向什么。

您可能真的不想在调试器中检查所有这些,但也许在某些情况下您需要断言和问题的详细报告?喜欢 "when I get here, I should be holding the last reference to this object, and if that's not true I want to raise an assertion and report what else is holding one"?如果是这种情况,您可以通过在添加和删除引用时启用一些详细的逐个对象日志记录来实现这一目标。

我们有一个关于互斥锁的类似问题,即我们想知道是否存在可能由代码路径导致的潜在死锁情况,这些代码路径可以以不同的顺序锁定和持有两个或多个互斥锁。我们最终构建了一个 "safe mutex" 来跟踪全局数据结构中的所有互斥锁顺序元组,以及检测不兼容顺序的逻辑。这对于生产来说太慢了,但在调试版本中运行良好。它还可以告诉我们给定线程是否锁定了互斥锁,以标记诸如在 RPC 调用期间持有互斥锁之类的问题,这在某些情况下是个坏主意。