为什么我的C ++类变量意外地在范围外变化?

时间:2012-05-18 01:44:24

标签: c++

我试图逆向工程并修复一个抛出未处理异常的Win32控制台应用程序。

我在线程中运行了32个类的实例。这些"服务"每个线程应定期创建/删除唯一的CMessage实例,并且每个CMessage对象在Service类中声明为私有。

当我在调试器中运行应用程序时(我使用Visual Studio 2005),CMessage的监视窗口指示在调用CMessage成员函数之前,CMessage的地址更改为0x00000000 - 原因是异常。

我没有直截了当的解释,为什么会发生这种情况。在前一行代码与此代码之间似乎没有发生任何不良事件,因此我怀疑在某些情况下,每个线程都错误地从其他线程之一引用CMessage对象(在线程生命周期中的某些时候,CMessage)该线程的对象被删除)。

我的问题是:确保这些CMessage对象是绝对线程安全的最佳方法是什么,除了当前的类范围外,无法从任何地方修改/删除?我认为这就是私人的用途,但我现在还不完全确定。我想做的一件事是引用CMessage对象如下:

this->myCMessage;

而不仅仅是:

myCMessage;

这会有什么不同吗?

1 个答案:

答案 0 :(得分:0)

类中的私有标记只是一个语法糖,它不会改变代码的生成方式。

如果你正在调用一个成员函数,并且在那之后类成员转到NULL,问题可能是成员函数以某种方式删除了CMessage对象。但请注意,如果CMessage对象是在堆栈中分配的,那么问题可能不是这种情况。

另一个问题可能是CService对象在完成访问CMessage对象的当前函数之前被破坏(线程被终止)。