我试图运行共享指针的一段简单代码。智能指针与初始化列表混淆
//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