2012-05-18 2 views
0

Я пытаюсь переделать инженер и исправить консольное приложение Win32, которое бросает необработанное исключение.Почему переменная класса C++ неожиданно меняет внешний вид?

У меня есть 32 экземпляра класса, работающего в потоках. Эти потоки «Служба» должны каждый раз создавать/удалять уникальный экземпляр CMessage, и каждый из этих объектов CMessage объявляется приватным в классе Service.

Когда я запускаю приложение в отладчике (я использую Visual Studio 2005), окно просмотра для CMessage указывает, что прямо перед тем, как функция члена CMessage вызывается, адрес изменений CMessage на 0x00000000 - причина исключения ,

Нет простого объяснения, которое я могу понять, почему это происходит. Кажется, что между предыдущей строкой кода и этим нет ничего неблагоприятного, поэтому мое подозрение состоит в том, что каким-то образом каждый поток ошибочно ссылается на объект CMessage из одного из других потоков в некоторых случаях (так как в какой-то момент во время жизни потоков CMessage объект для этого потока удаляется).

Мой вопрос: Каков наилучший способ убедиться, что эти объекты CMessage являются абсолютно безопасными потоками и не могут быть изменены/удалены из любого места, кроме текущего класса? Я думал, что это то, что было частным, но я не совсем уверен сейчас. Одна вещь, я думал о выполнении имел в виду объект CMessage следующим образом:

this->myCMessage; 

, а не просто:

myCMessage; 

ли это сделать разницу?

+0

Нет. Более вероятно, что вы вызываете некоторую функцию, которая не является потокобезопасной. – stark

ответ

0

Ну, частный тег в классе - это просто синтаксический сахар, он не изменит способ генерации кода.

Если вы вызываете функцию-член и сразу после этого член класса переходит в NULL, проблема может заключаться в том, что функция-член каким-то образом удаляет объект CMessage. Обратите внимание, что если объект CMessage выделен в стеке, проблема, вероятно, не в этом.

Другой проблемой может быть то, что объект CService будет уничтожен (поток завершается), прежде чем он завершит текущую функцию, обращаясь к объекту CMessage.

+0

Да, оказывается, там была другая нить вне этой функции, косвенно коснувшись указателя. Адрес, удерживаемый указателем, хранился в другом месте для вектора, содержимое которого периодически удалялось. Спасибо за помощь :) – Lordmonkey

Смежные вопросы