C ++布尔变量更改

时间:2011-04-11 16:59:19

标签: 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;
};

和.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行设置断点,这样我就可以确切地看到它们被设置/更改/读取的位置。顺序如下:

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

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

    更新: 每个阶段 this 的值:
    构造函数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));
        }
    

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

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

5 个答案:

答案 0 :(得分:9)

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


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

return (PageTableEntry *)&(*it);

*it的类型为std::pair<unsigned const, PageTableEntry*>&,因此您可以有效地将std::pair<unsigned const, PageTableEntry*>*重新诠释为PageTableEntry*。将该行更改为:

return it->second;

密切关注代码库中的其他演员。首先需要一个演员阵容是一种代码气味,并且不正确地进行演员表演的结果可能是未定义的行为,包括表现为你在这里看到的内存损坏。使用 C ++ 风格的强制转换而不是C风格的强制转换,可以轻松找到代码库中出现强制转换的位置,以便轻松查看它们( 提示,提示 < /强>)。

答案 1 :(得分:3)

尝试在每个断点处查看this的值。

答案 2 :(得分:3)

std::map<>::find()会返回iterator,当取消引用时会返回std::map<>::value_type。在这种情况下,value_typestd::pair<>。您要返回pair而不是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 (*it).second;
P.S:C风格的演员是邪恶的。编译器会发布一个带有C ++强制转换的诊断程序。 :)

答案 3 :(得分:0)

如果您正在使用STL容器,那么复制构造函数和赋值运算符将会被大量使用。也许如果你向我们展示那些代码,我们会发现错误。

答案 4 :(得分:0)

您可以在类中添加另一个唯一值来跟踪PageTableEntry吗? 我知道我遇到了这样的问题,其中真正的问题是有多个条目看起来相同而断点可能会在没有意识到的情况下切换PageTableEntry。