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调用期间保持互斥锁之类的问题,在某些情况下这是个坏主意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 Microsoft Embedded Visual C++ 进行远程调试

来自分类Dev

Microsoft Visual C ++无法编译

来自分类Dev

Microsoft Visual C ++存储库

来自分类Dev

如何在Microsoft Visual Studio 2017中检查C ++版本

来自分类Dev

C ++ #include在Microsoft Visual Studio 2010中不起作用

来自分类Dev

Microsoft Visual C ++ 2010 Express-正确代码中的错误

来自分类Dev

Visual C++ 中的指针

来自分类Dev

Microsoft Visual Studio中的输出

来自分类Dev

软件(Microsoft Visual Studio)不调试

来自分类Dev

Microsoft Visual Studio 2012 C ++循环参考

来自分类Dev

x11 / xlib与Microsoft Visual C ++

来自分类Dev

Microsoft Visual C ++是否与Windows平台绑定?

来自分类Dev

InstallShield 2014-Microsoft Visual C ++ 2015

来自分类Dev

Microsoft Visual C ++是否与Windows平台绑定?

来自分类Dev

如何在Visual Studio代码中调试从F2py接口调用共享库中的C函数的python程序

来自分类Dev

Visual Studio 2013中的调试技术c ++

来自分类Dev

Visual Studio调试c ++

来自分类Dev

如何在Microsoft的新Visual Studio Code中编译c#?

来自分类Dev

Microsoft Visual C ++的OpenMP更新,仍然停留在版本2中

来自分类Dev

Microsoft Visual Studio 2012无法在C#文件中设置断点

来自分类Dev

在Microsoft Visual Studio 2013的WinForms中为MySql(C#)启用实体框架6

来自分类Dev

Microsoft Visual Studio 2012无法在C#文件中设置断点

来自分类Dev

如何在Visual Studio中添加回“ Microsoft C ++基础类”

来自分类Dev

如何在Microsoft Visual Studio Express中具有多个用于Web的C#类

来自分类Dev

Visual C ++指针范围

来自分类Dev

在Visual Studio中访问Microsoft Azure

来自分类Dev

Microsoft Visual Studio 2012中的错误

来自分类Dev

在没有Microsoft扩展的Visual C ++中生成

来自分类Dev

是否存在与register_printf_function等效的Microsoft Visual C ++?

Related 相关文章

  1. 1

    使用 Microsoft Embedded Visual C++ 进行远程调试

  2. 2

    Microsoft Visual C ++无法编译

  3. 3

    Microsoft Visual C ++存储库

  4. 4

    如何在Microsoft Visual Studio 2017中检查C ++版本

  5. 5

    C ++ #include在Microsoft Visual Studio 2010中不起作用

  6. 6

    Microsoft Visual C ++ 2010 Express-正确代码中的错误

  7. 7

    Visual C++ 中的指针

  8. 8

    Microsoft Visual Studio中的输出

  9. 9

    软件(Microsoft Visual Studio)不调试

  10. 10

    Microsoft Visual Studio 2012 C ++循环参考

  11. 11

    x11 / xlib与Microsoft Visual C ++

  12. 12

    Microsoft Visual C ++是否与Windows平台绑定?

  13. 13

    InstallShield 2014-Microsoft Visual C ++ 2015

  14. 14

    Microsoft Visual C ++是否与Windows平台绑定?

  15. 15

    如何在Visual Studio代码中调试从F2py接口调用共享库中的C函数的python程序

  16. 16

    Visual Studio 2013中的调试技术c ++

  17. 17

    Visual Studio调试c ++

  18. 18

    如何在Microsoft的新Visual Studio Code中编译c#?

  19. 19

    Microsoft Visual C ++的OpenMP更新,仍然停留在版本2中

  20. 20

    Microsoft Visual Studio 2012无法在C#文件中设置断点

  21. 21

    在Microsoft Visual Studio 2013的WinForms中为MySql(C#)启用实体框架6

  22. 22

    Microsoft Visual Studio 2012无法在C#文件中设置断点

  23. 23

    如何在Visual Studio中添加回“ Microsoft C ++基础类”

  24. 24

    如何在Microsoft Visual Studio Express中具有多个用于Web的C#类

  25. 25

    Visual C ++指针范围

  26. 26

    在Visual Studio中访问Microsoft Azure

  27. 27

    Microsoft Visual Studio 2012中的错误

  28. 28

    在没有Microsoft扩展的Visual C ++中生成

  29. 29

    是否存在与register_printf_function等效的Microsoft Visual C ++?

热门标签

归档