为什么我的 C++ 类变量意外地在范围之外更改

  • 本文关键字:范围 意外 类变量 C++ c++
  • 更新时间 :
  • 英文 :


我正在尝试对 Win32 控制台应用程序进行反向工程并修复一个引发未经处理的异常的 Win32 控制台应用程序。

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

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

对于为什么会发生这种情况,我看不到直接的解释。在上一行代码和这一行代码之间似乎没有发生任何不幸的事情,所以我怀疑在某些情况下,每个线程都以某种方式错误地从其他线程之一引用了 CMessage 对象(因为在线程生存期内的某个时刻,该线程的 CMessage 对象被删除(。

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

this->myCMessage;

而不是仅仅:

myCMessage;

这会有什么不同吗?

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

如果要调用成员函数,然后类成员转到 NULL,则问题可能是成员函数以某种方式删除了 CMessage 对象。但请注意,如果 CMessage 对象是在堆栈中分配的,则问题可能不是这种情况。

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

最新更新