【发布时间】:2011-08-03 05:53:47
【问题描述】:
我有一个 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 变量为 FALSE!
PageTableEntry 的每个实例都会出现这种情况。类本身并没有改变变量 - 别的东西是。不幸的是,我不知道是什么。该类是使用 new 动态创建的,并被传递(作为指针)到各种 STL 结构,包括向量和映射。我自己的代码永远不会调用 mutator(我还没有达到那个点),并且 STL 结构不应该能够调用,并且由于从未在 mutator 上调用断点,我只能假设它们不是.
显然有一些“陷阱”,在某些情况下,可以在不通过类的 mutator 的情况下更改私有变量,由不知道是什么情况触发,但我无法想象它会是什么。有什么想法吗?
更新:
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() 函数来检索条目。
UNRELATED:由于 C++ 现在有 65663 个问题,而到目前为止,今天已经提出了 164 个问题,这意味着仅在今天,C++ 标记问题的数量超过了 16 位无符号整数。有用?不,有趣吗?是的。 :)
【问题讨论】:
-
这可能是 C++ As-If-Broken 规则的一个实例。这是允许编译器将正确程序变成错误程序的规则,尤其是在优化时。
标签: c++ variables private self-modifying