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调用期间保持互斥锁之类的问题,在某些情况下这是个坏主意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句