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<>
构造函数添加一个字符串(一个"标签")参数(也许使用__FUNCTION__
和一些用于上下文标记的宏化),你至少可以在某个时间点转储映射,并查看指向什么。
您可能真的不想在调试器中检查所有这些,但在某些情况下,您可能想要一个问题的断言和详细报告?比如"当我到达这里时,我应该持有对这个对象的最后一个引用,如果这不是真的,我想提出一个断言,并报告持有断言的还有什么"?如果是这样的话,您可以通过在添加和删除引用时启用一些详细的逐对象日志记录来实现这一点。
关于互斥锁,我们也遇到了类似的问题,即我们想知道代码路径是否会导致潜在的死锁情况,这些代码路径可以以不同的顺序锁定和持有两个或多个互斥锁。我们最终构建了一个"安全互斥",它跟踪全局数据结构中所有互斥锁定的顺序元组,以及检测不兼容顺序的逻辑。这对于生产来说太慢了,但在调试构建中运行得很好。它还可以告诉我们,如果给定的线程锁定了互斥锁,那么就可以标记RPC调用期间持有互斥锁之类的问题,在某些情况下这是个坏主意。
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 嵌套类、继承和C++中的共享指针
- 制作一对共享指针并推送一个向量
- 如何将共享指针用作函数参数
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 尝试通过共享指针使用变量时读取访问冲突
- 如何将元素插入到标准::地图的共享指针中?
- 共享指针生存期
- 初始化可变数据结构中的共享指针向量
- 阻止在返回时复制共享指针