Почему сдвигаются члены класса
От: Аноним  
Дата: 21.09.04 03:47
Оценка:
Есть член класса — int m_action. Только в одной функции происходит его заполнение : m_action=i; В других местах я его только использую.
Выявился противный баг: значение m_action меняется независимо от меня (поток один) и я не знаю где. Более того меняется адрес m_action. Что такое? Почему такое может происходить?
Re: Почему сдвигаются члены класса
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 21.09.04 03:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть член класса — int m_action. Только в одной функции происходит его заполнение : m_action=i; В других местах я его только использую.

А>Выявился противный баг: значение m_action меняется независимо от меня (поток один) и я не знаю где. Более того меняется адрес m_action. Что такое? Почему такое может происходить?

Код на сцену.
getboost.codeplex.com
citylizard.codeplex.com
Re[2]: Почему сдвигаются члены класса
От: Аноним  
Дата: 21.09.04 03:55
Оценка:
Здравствуйте, sergey_shandar, Вы писали:

_>Здравствуйте, Аноним, Вы писали:


А>>Есть член класса — int m_action. Только в одной функции происходит его заполнение : m_action=i; В других местах я его только использую.

А>>Выявился противный баг: значение m_action меняется независимо от меня (поток один) и я не знаю где. Более того меняется адрес m_action. Что такое? Почему такое может происходить?

_>Код на сцену.


Я бы с удовольствием. Да только он очень большой и поэтому я думаю вряд ли кто-то будет разбираться. Я только спрашиваю — почему такое может произойти?
Выяснилось, что меняеттся значание и другого члена класса. Он enum , а становится равным 62 (в enum нет такого значения )
Re: Почему сдвигаются члены класса
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 21.09.04 04:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Есть член класса — 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
Re[3]: Почему сдвигаются члены класса
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 21.09.04 04:09
Оценка:
Здравствуйте, Аноним, Вы писали:

_>>Код на сцену.


А>Я бы с удовольствием. Да только он очень большой и поэтому я думаю вряд ли кто-то будет разбираться.

Попробуй уменшать (комментировать) код до тех пор пока ошибка будет стабильной.

А>Я только спрашиваю — почему такое может произойти?

Да все что уогодно. К тому же зависит от компилятора, платформы, отладчика и т.д.
getboost.codeplex.com
citylizard.codeplex.com
Re: Почему сдвигаются члены класса
От: Аноним  
Дата: 21.09.04 04:17
Оценка:
Блин, у меня вообще весь класс корежит. Все члены другими становятся.
Re[3]: Почему сдвигаются члены класса
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 21.09.04 04:23
Оценка:
Здравствуйте, <Аноним>, Вы писали:

OE>>поставь точку прерывания на изменение m_action и отлови в отладчике


А>Не получается.


в http://www.rsdn.ru/article/vcpp/vcdebug-1.xml
Автор(ы): Александр Шаргин
Дата: 27.01.2002
— Окно Edit->Breakpoints — Закладка Data описано как поставить точку прерывания на изменение памяти по адресу переменной — &m_action
Re: Почему сдвигаются члены класса
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 21.09.04 04:25
Оценка:
Здравствуйте, <Аноним>, Вы писали:

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. Он в программе только один
Re[3]: Почему сдвигаются члены класса
От: Вадим Никулин Россия Здесь
Дата: 21.09.04 05:09
Оценка:
Здравствуйте, Аноним, Вы писали:

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: Почему сдвигаются члены класса
От: Аноним  
Дата: 21.09.04 05:30
Оценка:
Всё, Ура, нашел
Re[2]: Почему сдвигаются члены класса
От: Вадим Никулин Россия Здесь
Дата: 21.09.04 05:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всё, Ура, нашел


Что было-то?
Re[3]: Почему сдвигаются члены класса
От: Аноним  
Дата: 21.09.04 05:43
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:

ВН>Здравствуйте, Аноним, Вы писали:


А>>Всё, Ура, нашел


ВН>Что было-то?


Есть два MFC-шных окна. При создании второго указываем родителя первое. Это самое первое — CMainFrame. Я как дурак думал, что GetParent() у второго окна вернет указатель на первое. Как бы не так. Не знаю что возвращает GetParent(), но стало работать с GetParentFrame(). Дурь какая-то
Re[3]: Почему сдвигаются члены класса
От: Кодт Россия  
Дата: 21.09.04 06:55
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Я бы с удовольствием. Да только он очень большой и поэтому я думаю вряд ли кто-то будет разбираться. Я только спрашиваю — почему такое может произойти?

А>Выяснилось, что меняеттся значание и другого члена класса. Он enum , а становится равным 62 (в enum нет такого значения )

1. Нарушение One Definition Rule: условная компиляция / разное выравнивание: в разных файлах этот класс представляется разной структурой.
2. Некорректная работа с указателями на объекты (смещение относительно истинного начала): например, reinterpret_cast или, что то же самое, приведение к void* и обратно.
3. Стрельба по памяти.
4. Глюки отладчика.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.