我試圖運行共享指針的一段簡單代碼。智能指針與初始化列表混淆
//in the class definition
Rule(std::string name,
std::vector<std::vector<std::shared_ptr<RuleMember>>> rules);
...
//in function 'main'
shared_ptr<Rule> expression(new Rule("expression", {
{ identifier },
{ expression, add, identifier }
}));
編譯成功,但是「程序停止工作」,當我嘗試運行它時。我遍歷代碼,當執行離開main
(這是包含此代碼的函數)時,它會失敗。
有趣的是,當我明確地周圍添加表達的構造,工作原理:
shared_ptr<Rule> expression(new Rule("expression", {
{ identifier },
{ shared_ptr<Rule> (expression), add, identifier }
}));
我有三個問題:
- 當我通過一個本地
shared_ptr
變量(會發生什麼expression
在這種情況下)到初始化列表?我認爲會調用一個拷貝構造函數,爲我初始化的集合創建一個新的shared_ptr
。 expression
的構造函數尚未完成,在函數作用域中由expression
指向的集合中的shared_ptr
可能不包含有效指針嗎?- 程序在
{ __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
<atomicity.h>
某處停止工作的事實是否與此有關,還是隻是一個隨機的地方?
關於(1),當你正在構建你想複製的對象時,我不知道會發生什麼。而且(2)的推測是(1)(至少在我讀你的代碼時)的失敗的直接結果似乎是合理的。 Fyi,clang會在第一個例子中顯示警告(*「變量'表達式在初始化時使用未初始化」*)。我會很難用它來描述它。 – WhozCraig 2014-08-30 08:12:32
@WhozCraig,那麼這意味着我必須在創建智能指針後初始化規則對象。我認爲我會省下一些線。謝謝。 – user35443 2014-08-30 08:18:48
@firda,我相信我不會創建兩個distict shared_ptrs:http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr(9) – user35443 2014-08-30 08:19:16