共享指针在Manager类中损坏/不正确?

时间:2013-03-02 13:55:51

标签: c++ shared-ptr

如果这是显而易见的道歉,我会尝试提供一个最小的例子,因为我在过去的一个小时里一直在讨论这个问题,我确信这很简单。

我有以下内容:

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""。有些东西在某处出错了。试图获得更多代码以在实际类之外重现它。

1 个答案:

答案 0 :(得分:1)

向所有善意评论的人致歉。像往常一样,当你长时间盯着屏幕(休息时间?)时会发生什么。事实证明,我在表中存储了对表名的引用,而不是将其复制过来。这意味着当(L“_contract”)超出范围(不按顺序?)时,它实际上已经死了 - 因此后者出现问题。

感谢所有关注这个问题的人。