У меня есть класс C ++; этот класс выглядит следующим образом:
Сначала заголовок:
class PageTableEntry {
public:
PageTableEntry(bool modified = true);
virtual ~PageTableEntry();
bool modified();
void setModified(bool modified);
private:
PageTableEntry(PageTableEntry &existing);
PageTableEntry &operator=(PageTableEntry &rhs);
bool _modified;
};
И файл .cpp
#include "PageTableEntry.h"
PageTableEntry::PageTableEntry(bool modified) {
_modified = modified;
}
PageTableEntry::~PageTableEntry() {}
bool PageTableEntry::modified() {
return _modified;
}
void PageTableEntry::setModified(bool modified) {
_modified = modified;
}
Я установил точку останова на все 3 строки в файле .cpp, включая _modified, чтобы я мог точно видеть, где они устанавливаются / изменяются / читаются. Последовательность выглядит следующим образом:
- Точка останова в конструкторе срабатывает. подтверждено, что _модифицированная переменная имеет значение true
- Точка останова в аксессоре срабатывает. _модифицированная переменная ЛОЖЬ!
Это происходит с каждым экземпляром PageTableEntry. Сам класс не меняет переменную - что-то еще. К сожалению, я не знаю что. Класс создается динамически с использованием new и передается (как указатели) различным структурам STL, включая вектор и карту. Мутатор никогда не вызывается из моего собственного кода (я еще не дошел до этого момента), и структуры STL не должны этого делать, и поскольку точка останова никогда не вызывается у мутатора, я могу только предположить, что они не являются .
Ясно, что есть некоторая «ошибка», когда частные переменные могут, при определенных обстоятельствах, быть изменены без прохождения через мутатор класса, вызванный ситуацией «кто знает, что», но я не могу себе представить, что это может быть. Есть мысли?
UPDATE:
Значение это на каждом этапе:
Конструктор 1: 0x100100210
Конструктор 2: 0x100100400
Accessor 1: 0x1001003f0
Accessor 2: 0x100100440
UPDATE2:
(код, показывающий, где осуществляется доступ к PageTableEntry)
// In constructor:
_tableEntries = std::map<unsigned int, PageTableEntry *>();
// To get an entry in the table (body of testAddr() function, address is an unsigned int:
std::map<unsigned int, PageTableEntry *>::iterator it;
it = _tableEntries.find(address);
if (it == _tableEntries.end()) {
return NULL;
}
return (PageTableEntry *)&(*it);
// To create a new entry:
PageTableEntry *entry = testAddr(address);
if (!entry) {
entry = new PageTableEntry(_currentProcessID, 0, true, kStorageTypeDoesNotExist);
_tableEntries.insert(std::pair<unsigned int, PageTableEntry *>(address, entry));
}
Это единственные точки, в которых объекты PageTableEntry хранятся и извлекаются из структур STL, чтобы вызвать проблему. Все остальные функции используют функцию testAddr () для извлечения записей.
UNRELATED: Поскольку в C ++ сейчас 65663 вопроса, а сегодня было задано 164 вопроса, это означает, что только сегодня число вопросов с тегами C ++ превысило 16-разрядное целое число без знака. Полезно? Интересно? Да. :)