道歉,如果這是顯而易見的,我會盡量提供一個最小的例子,因爲在過去的一個小時裏,我一直在抨擊這件事,我確信這很簡單。共享指針在經理類中損壞/不正確?
我有以下幾點:
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""
表名。有些事情是會出錯的地方。試圖讓更多的代碼重現它的實際類之外。
是的,一個測試用例會很有用。 – 2013-03-02 13:58:37
如果std :: map :: operator []不存在,它將已經插入一個元素。 (它只是不會爲你創建新的表格())。 – 2013-03-02 13:59:21
@sftrabbit:的確如此。不過,我不太明白這是如何影響的。因爲OP會立即爲該元素分配正確的東西。 – 2013-03-02 14:00:26