0

我正在尝试逆向工程并修复引发未处理异常的 Win32 控制台应用程序。

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

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

没有直接的解释可以解释为什么会发生这种情况。前一行代码和这一行之间似乎没有发生任何不愉快的事情,所以我怀疑在某些情况下,每个线程都错误地从其他线程之一引用了 CMessage 对象(如在线程生命周期中的某个时刻 CMessage该线程的对象被删除)。

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

this->myCMessage;

而不仅仅是:

myCMessage;

这会有什么不同吗?

4

1 回答 1

0

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

如果您正在调用成员函数,然后类成员变为 NULL,则问题可能是成员函数以某种方式删除了 CMessage 对象。但请注意,如果 CMessage 对象是在堆栈中分配的,则问题可能并非如此。

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

于 2012-05-18T10:46:12.727 回答