私は 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 構造が呼び出されることはありません。ミューテーターでブレークポイントが呼び出されることはないため、それらが呼び出されていないと想定することしかできません。 .
明らかに、特定の状況下で、誰が何を知っているかによって引き起こされる、クラスのミューテーターを介さずにプライベート変数を変更できる「落とし穴」がありますが、それが何であるかは想像できません。何かご意見は?
更新:各段階でのこの
値:
コンストラクター 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() 関数を使用してエントリを取得します。
UNRELATED: C++ には現在 65663 の質問があり、今日これまでに 164 が質問されているため、今日だけで C++ タグ付きの質問の数が 16 ビットの符号なし整数を超えたことを意味します。使える?いいえ、面白いですか?はい。:)