我有一个 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;
}
我在 .cpp 文件中涉及 _modified 的所有 3 行上设置了一个断点,这样我就可以准确地看到它们被设置/更改/读取的位置。顺序如下:
- 构造函数中的断点被触发。_modified 变量确认设置为true
- 访问器中的断点被触发。_modified 变量为假!
这发生在每个 PageTableEntry 实例中。类本身并没有改变变量 - 别的东西是。不幸的是,我不知道是什么。该类是使用 new 动态创建的,并被传递(作为指针)到各种 STL 结构,包括向量和映射。我自己的代码永远不会调用 mutator(我还没有达到那一点),并且 STL 结构不应该能够,并且由于从未在 mutator 上调用断点,我只能假设它们不是.
显然有一些“陷阱”,在某些情况下,私有变量可以在不通过类的 mutator 的情况下被更改,由谁知道什么情况触发,但我无法想象它会是什么。有什么想法吗?
更新:每个阶段的值:构造
函数 1:0x100100210
构造函数 2:0x100100400访问器
1:0x1001003f0 访问器
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() 函数来检索条目。
不相关:由于 C++ 现在有 65663 个问题,而到目前为止,今天已经提出了 164 个问题,这意味着就在今天,C++ 标记问题的数量超过了 16 位无符号整数。有用?不,有趣吗?是的。:)