C++布尔变量更改

Jus*_*kva 3 c++ variables private self-modifying

我有一个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;
};
Run Code Online (Sandbox Code Playgroud)

和.cpp文件

#include "PageTableEntry.h"

PageTableEntry::PageTableEntry(bool modified) {
    _modified = modified;
}

PageTableEntry::~PageTableEntry() {}

bool PageTableEntry::modified() {
    return _modified;
}
void PageTableEntry::setModified(bool modified) {
    _modified = modified;
}
Run Code Online (Sandbox Code Playgroud)

我在.cpp文件中涉及_modified的所有3行设置断点,这样我就可以确切地看到它们被设置/更改/读取的位置.顺序如下:

  1. 触发构造函数中的断点.确认_modified变量设置为true
  2. 访问器中的断点被触发._modified变量为FALSE!

每个PageTableEntry实例都会出现这种情况.类本身并没有改变变量 - 其他东西是.不幸的是,我不知道是什么.该类是使用new动态创建的,并且被传递(作为指针)到各种STL结构,包括向量和映射.我的代码永远不会调用mutator(我还没有达到这一点)并且STL结构不应该这样,并且因为断言器永远不会在mutator上被调用,所以我只能假设它们不是.

显然,在某些情况下,私有变量可以在不经过类的变换器的情况下进行更改,由谁知道什么情况触发,但我无法想象它可能是什么.有什么想法吗?

UPDATE:的值在每个阶段:
构造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));
    }
Run Code Online (Sandbox Code Playgroud)

这些是从STL结构中存储和检索PageTableEntry对象的唯一点,以便引发问题.所有其他函数都使用testAddr()函数来检索条目.

UNRELATED:由于C++现在有65663个问题,到目前为止已经有164个问题,这意味着只有今天 C++标记问题的数量超过了16位无符号整数.有用?没有意思?是.:)

ild*_*arn 9

您的调试器未正确报告该值(并非闻所未闻,甚至在优化版本中预期),或者您的程序中的其他位置存在内存损坏.您展示的代码或多或少都很好,应该按照您的预期行事.


编辑对应你的'UPDATE2':
问题出在这一行:

return (PageTableEntry *)&(*it);
Run Code Online (Sandbox Code Playgroud)

类型*itstd::pair<unsigned const, PageTableEntry*>&,所以你有效地重新诠释了std::pair<unsigned const, PageTableEntry*>*一个PageTableEntry*.将该行更改为:

return it->second;
Run Code Online (Sandbox Code Playgroud)

留意代码库中的其他演员.首先需要一个演员阵容是一种代码气味,不正确地进行演员表演的结果可能是未定义的行为,包括表现为你在这里看到的内存损坏.使用C++风格的强制转换而不是C风格的强制转换使得查找代码库中出现强制转换的位置变得微不足道,因此可以轻松查看它们(提示,提示).