1

抱歉,如果这很明显,我会尝试提供一个最小的例子,因为我在过去的一个小时里一直在努力解决这个问题,我确信这很简单。

我有以下内容:

class Table { /* implementation superfluous */ };
typedef boost::shared_ptr<Table> TablePtr;

后来,在一个数据库类中:

class Database{
    typedef std::map<std::wstring, TablePtr> table_map_type;
    table_map_type tableCache_;
};

我定义了一个运算符来获取一个表:

TablePtr Database::operator[](const std::wstring& name) {
    table_map_type::iterator it(tableCache_.find(name));
    if(it != tableCache_.end())
        return it->second;

    // not found, create
    TablePtr ret(new Table());
    tableCache_[name] = ret;
    return ret;
};

现在发生的事情是,在我第一次打电话时,这很好。没有找到具有给定表名的任何内容,它被创建 - 放置在地图中,并在共享指针中返回。

这个问题稍后会出现,当我回到同一个实例并寻找相同的名称时。它正确地找到它,然后返回return it->second。然而,对该对象的下一个直接调用飞入了恶魔和鼻子,并带有一个不是创建的对象。

我确定我遗漏了一些明显的东西。提前致谢。

编辑

由于我的最小代码示例有效,我将不得不更深入地挖掘。看来,即使是第一个插入也不能正常工作。在上述operator[]函数中,TablePtr构造函数在其中包含一个有效的表对象(因为内部名称显示为L"_contract"。我做了一个简单的测试行:

db::TablePtr first((*db)[L"_contract"]);

在该函数中,表名是_contract. 在调试器中检查first,显示一个表名L"". 某处出了差错。试图获得更多代码以在实际类之外重现它。

4

1 回答 1

1

向所有善意评论的人道歉。像往常一样,当您盯着屏幕太久(该休息一下?)时会发生这种情况。事实证明,我在表中存储了对表名的引用,而不是复制它。这意味着当 (L"_contract") 超出范围(乱序?)时,它实际上已经死了——因此是后一个问题。

感谢所有困惑地看着这个问题的人。

于 2013-03-02T14:56:17.123 回答