2014-08-30 92 views
3

我試圖運行共享指針的一段簡單代碼。智能指針與初始化列表混淆

//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 } 
})); 

我有三個問題:

  1. 當我通過一個本地shared_ptr變量(會發生什麼expression在這種情況下)到初始化列表?我認爲會調用一個拷貝構造函數,爲我初始化的集合創建一個新的shared_ptr
  2. expression的構造函數尚未完成,在函數作用域中由expression指向的集合中的shared_ptr可能不包含有效指針嗎?
  3. 程序在{ __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }<atomicity.h>某處停止工作的事實是否與此有關,還是隻是一個隨機的地方?
+0

關於(1),當你正在構建你想複製的對象時,我不知道會發生什麼。而且(2)的推測是(1)(至少在我讀你的代碼時)的失敗的直接結果似乎是合理的。 Fyi,clang會在第一個例子中顯示警告(*「變量'表達式在初始化時使用未初始化」*)。我會很難用它來描述它。 – WhozCraig 2014-08-30 08:12:32

+0

@WhozCraig,那麼這意味着我必須在創建智能指針後初始化規則對象。我認爲我會省下一些線。謝謝。 – user35443 2014-08-30 08:18:48

+0

@firda,我相信我不會創建兩個distict shared_ptrs:http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr(9) – user35443 2014-08-30 08:19:16

回答

1

變量在初始化程序列表中使用時未初始化。看看會發生什麼:

#include <memory> 
#include <string> 
#include <vector> 
#include <iostream> 
using std::shared_ptr; 
using std::string; 
using std::vector; 

struct Rule { 
    string name; 
    vector<vector<shared_ptr<Rule>>> rules; 
    Rule(string name, 
     vector<vector<shared_ptr<Rule>>> rules) 
    : name(name), rules(rules) {} 
}; 

using std::cout; 
using std::endl; 

int main() { 
    shared_ptr<Rule> identifier, add; 
    shared_ptr<Rule> expression(new Rule("expression", { 
     { identifier }, 
     { expression, add, identifier } 
    })); 

    cout << expression->name << ": " 
     << (uintptr_t)expression.get() << " ? " 
     << (uintptr_t)expression->rules[1][0].get(); 
} 

輸出:

expression: 536937312 ? 2282820

它崩潰,當我嘗試存取權限expression->rules[1][0]->name;

+0

驚訝我沒有得到警告(g ++ -Wall -pedantic) – firda 2014-08-30 08:40:25

+0

clang更好:'警告:變量'表達式'在其初始化時未初始化[-Winitialized]' - '{表達式,添加,標識符}' – firda 2014-08-30 08:47:22

+0

這被報告爲一個錯誤(或缺少警告)? – user35443 2014-08-30 08:48:06