2013-03-02 51 views
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""表名。有些事情是會出錯的地方。試圖讓更多的代碼重現它的實際類之外。

+0

是的,一個測試用例會很有用。 – 2013-03-02 13:58:37

+1

如果std :: map :: operator []不存在,它將已經插入一個元素。 (它只是不會爲你創建新的表格())。 – 2013-03-02 13:59:21

+2

@sftrabbit:的確如此。不過,我不太明白這是如何影響的。因爲OP會立即爲該元素分配正確的東西。 – 2013-03-02 14:00:26

回答

1

許多歉意大家誰好心評論。像往常一樣,它是什麼當你一直盯着屏幕太低時會發生ng(休息時間?)。事實證明,我在表中存儲對錶名的引用,而不是將其複製過來。這意味着當(L「_contract」)超出範圍(不按順序?)時,它實際上已經死亡 - 因此後者存在問題。

感謝所有看過這個問題的人。