2014-08-30 62 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