如果这是显而易见的道歉,我会尝试提供一个最小的例子,因为我在过去的一个小时里一直在讨论这个问题,我确信这很简单。
我有以下内容:
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""
。有些东西在某处出错了。试图获得更多代码以在实际类之外重现它。
答案 0 :(得分:1)
向所有善意评论的人致歉。像往常一样,当你长时间盯着屏幕(休息时间?)时会发生什么。事实证明,我在表中存储了对表名的引用,而不是将其复制过来。这意味着当(L“_contract”)超出范围(不按顺序?)时,它实际上已经死了 - 因此后者出现问题。
感谢所有关注这个问题的人。