我有一个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;
}
我在涉及_modified的.cpp文件中的所有3行上设置了断点,以便我可以准确地看到它们何时被设置/更改/读取。顺序如下:
- 构造函数中的断点被触发。确认已将_modified变量设置为true
- 访问器中的断点被触发。_modified变量为FALSE!
每个PageTableEntry实例都会出现这种情况。类本身不会更改该变量-其他东西会更改。不幸的是,我不知道是什么。该类使用new动态创建,并被传递(作为指针)到各种STL结构中,包括向量和映射。修改器从未被我的代码调用过(我还没有到达那个阶段),STL结构也不应该能够调用,由于在修改器上永远不会触发断点,因此我只能假设它们没有。
显然,在某些情况下,私有变量可以在不经过类的修改器的情况下更改,由谁知道什么情况触发,但我无法想象它可能是什么。有什么想法吗?
更新:
每个阶段的this的值:
构造函数1:0x100100210
构造函数2:0x100100400
访问器1:0x1001003f0
访问器2:0x100100440
更新2:
(显示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位无符号整数。有用吗?不。有趣吗?是的。 :)