抱歉,如果这很明显,我会尝试提供一个最小的例子,因为我在过去的一个小时里一直在努力解决这个问题,我确信这很简单。
我有以下内容:
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""
. 某处出了差错。试图获得更多代码以在实际类之外重现它。