我试图逆向工程并修复一个抛出未处理异常的Win32控制台应用程序。
我在线程中运行了32个类的实例。这些"服务"每个线程应定期创建/删除唯一的CMessage实例,并且每个CMessage对象在Service类中声明为私有。
当我在调试器中运行应用程序时(我使用Visual Studio 2005),CMessage的监视窗口指示在调用CMessage成员函数之前,CMessage的地址更改为0x00000000 - 原因是异常。
我没有直截了当的解释,为什么会发生这种情况。在前一行代码与此代码之间似乎没有发生任何不良事件,因此我怀疑在某些情况下,每个线程都错误地从其他线程之一引用CMessage对象(在线程生命周期中的某些时候,CMessage)该线程的对象被删除)。
我的问题是:确保这些CMessage对象是绝对线程安全的最佳方法是什么,除了当前的类范围外,无法从任何地方修改/删除?我认为这就是私人的用途,但我现在还不完全确定。我想做的一件事是引用CMessage对象如下:
this->myCMessage;
而不仅仅是:
myCMessage;
这会有什么不同吗?
答案 0 :(得分:0)
类中的私有标记只是一个语法糖,它不会改变代码的生成方式。
如果你正在调用一个成员函数,并且在那之后类成员转到NULL,问题可能是成员函数以某种方式删除了CMessage对象。但请注意,如果CMessage对象是在堆栈中分配的,那么问题可能不是这种情况。
另一个问题可能是CService对象在完成访问CMessage对象的当前函数之前被破坏(线程被终止)。