Есть член класса — int m_action. Только в одной функции происходит его заполнение : m_action=i; В других местах я его только использую.
Выявился противный баг: значение m_action меняется независимо от меня (поток один) и я не знаю где. Более того меняется адрес m_action. Что такое? Почему такое может происходить?
Здравствуйте, Аноним, Вы писали:
А>Есть член класса — int m_action. Только в одной функции происходит его заполнение : m_action=i; В других местах я его только использую. А>Выявился противный баг: значение m_action меняется независимо от меня (поток один) и я не знаю где. Более того меняется адрес m_action. Что такое? Почему такое может происходить?
Здравствуйте, sergey_shandar, Вы писали:
_>Здравствуйте, Аноним, Вы писали:
А>>Есть член класса — int m_action. Только в одной функции происходит его заполнение : m_action=i; В других местах я его только использую. А>>Выявился противный баг: значение m_action меняется независимо от меня (поток один) и я не знаю где. Более того меняется адрес m_action. Что такое? Почему такое может происходить?
_>Код на сцену.
Я бы с удовольствием. Да только он очень большой и поэтому я думаю вряд ли кто-то будет разбираться. Я только спрашиваю — почему такое может произойти?
Выяснилось, что меняеттся значание и другого члена класса. Он enum , а становится равным 62 (в enum нет такого значения )
Здравствуйте, <Аноним>, Вы писали:
А>Есть член класса — int m_action. Только в одной функции происходит его заполнение : m_action=i; В других местах я его только использую. А>Выявился противный баг: значение m_action меняется независимо от меня (поток один) и я не знаю где. Более того меняется адрес m_action. Что такое? Почему такое может происходить?
поставь точку прерывания на изменение m_action и отлови в отладчике
Re[2]: Почему сдвигаются члены класса
От:
Аноним
Дата:
21.09.04 04:07
Оценка:
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, <Аноним>, Вы писали:
А>>Есть член класса — int m_action. Только в одной функции происходит его заполнение : m_action=i; В других местах я его только использую. А>>Выявился противный баг: значение m_action меняется независимо от меня (поток один) и я не знаю где. Более того меняется адрес m_action. Что такое? Почему такое может происходить?
OE>поставь точку прерывания на изменение m_action и отлови в отладчике
Не получается.
Ставлю New break point — Data — Variable: m_active_plugin
Не встает почему-то. Даже в m_active_plugin=i
Здравствуйте, Аноним, Вы писали:
_>>Код на сцену.
А>Я бы с удовольствием. Да только он очень большой и поэтому я думаю вряд ли кто-то будет разбираться.
Попробуй уменшать (комментировать) код до тех пор пока ошибка будет стабильной.
А>Я только спрашиваю — почему такое может произойти?
Да все что уогодно. К тому же зависит от компилятора, платформы, отладчика и т.д.
Здравствуйте, <Аноним>, Вы писали:
A>Есть член класса — int m_action А>Выявился противный баг: значение m_action меняется независимо от меня (поток один) и я не знаю где. Более того меняется адрес m_action.
если меняется адрес — это значит ты смотришь m_action уже другого объекта этого класса, вполне естесственно, что у нее будет другое значение, которое никак не зависит от первой m_action
Re[2]: Почему сдвигаются члены класса
От:
Аноним
Дата:
21.09.04 04:34
Оценка:
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, <Аноним>, Вы писали:
A>>Есть член класса — int m_action А>>Выявился противный баг: значение m_action меняется независимо от меня (поток один) и я не знаю где. Более того меняется адрес m_action.
OE>если меняется адрес — это значит ты смотришь m_action уже другого объекта этого класса, вполне естесственно, что у нее будет другое значение, которое никак не зависит от первой m_action
Нет-нет. Другого объекта быть не может. Это MFC-шный CMainFrame. Он в программе только один
Здравствуйте, Аноним, Вы писали:
OE>>если меняется адрес — это значит ты смотришь m_action уже другого объекта этого класса, вполне естесственно, что у нее будет другое значение, которое никак не зависит от первой m_action
А>Нет-нет. Другого объекта быть не может. Это MFC-шный CMainFrame. Он в программе только один
Если включена оптимизация (или, тем более, сборка Release), то значения всех переменных отладчик показывает неверно. Попробуй выводить в лог, и т. д.
Re[4]: Почему сдвигаются члены класса
От:
Аноним
Дата:
21.09.04 05:14
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:
ВН>Если включена оптимизация (или, тем более, сборка Release), то значения всех переменных отладчик показывает неверно. Попробуй выводить в лог, и т. д.
Нет оптримизации
Debug (я даже пока не разу под Release и не компилировал)
Re[4]: Почему сдвигаются члены класса
От:
Аноним
Дата:
21.09.04 05:16
Оценка:
Здравствуйте, sergey_shandar, Вы писали:
_>Да все что уогодно.
Здравствуйте, Аноним, Вы писали:
А>Всё, Ура, нашел
Что было-то?
Re[3]: Почему сдвигаются члены класса
От:
Аноним
Дата:
21.09.04 05:43
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:
ВН>Здравствуйте, Аноним, Вы писали:
А>>Всё, Ура, нашел
ВН>Что было-то?
Есть два MFC-шных окна. При создании второго указываем родителя первое. Это самое первое — CMainFrame. Я как дурак думал, что GetParent() у второго окна вернет указатель на первое. Как бы не так. Не знаю что возвращает GetParent(), но стало работать с GetParentFrame(). Дурь какая-то
Здравствуйте, Аноним, Вы писали:
А>Я бы с удовольствием. Да только он очень большой и поэтому я думаю вряд ли кто-то будет разбираться. Я только спрашиваю — почему такое может произойти? А>Выяснилось, что меняеттся значание и другого члена класса. Он enum , а становится равным 62 (в enum нет такого значения )
1. Нарушение One Definition Rule: условная компиляция / разное выравнивание: в разных файлах этот класс представляется разной структурой.
2. Некорректная работа с указателями на объекты (смещение относительно истинного начала): например, reinterpret_cast или, что то же самое, приведение к void* и обратно.
3. Стрельба по памяти.
4. Глюки отладчика.