c ++当前面的步骤抛出异常时,为什么std :: shared_ptr引用的指针被销毁

时间:2018-03-28 11:45:58

标签: c++

目前我在std::unordered_map<key,List<shared_ptr<t>>>中有一个自己版本的链表(其中t是某种类型)。我插入这样的东西:

void addTo(const Key &key, t* ptr)
{
    if(ptr==nullptr||ptr==NULL){
       throw "this is not a real exception that I am using"
   }
    try
    {
        this->getList(key).addNew(std::shared_ptr<t>(ptr));
    }
    catch(std::out_of_range ex)
    {
        this->addList(key,(std::shared_ptr<t>(ptr));
    }
}

但是,我最近注意到,当getList抛出一个out_of_range异常时(如果映射中没有像这样的密钥,它总是这样做)那么ptr会被删除。现在,如果在调用getList之前创建shared_ptr是有意义的,但为什么会出现这种情况呢?

我已经通过简单地分离this-&gt; getList和addNew来修改这个:

const List<shared_ptr<t>> l& = this->getList(key);
l.addNew(etc etc);

当这样写时,指针没有任何反应。

这让我得出结论,首先创建shared_ptr,这意味着c ++首先处理实例化?对我而言,这并没有多大意义。

c ++执行这些语句的顺序的确切规则是什么?为什么不实例化shared_ptr AFTER - &gt; getList(以不同方式执行此操作的原因是什么)?

1 个答案:

答案 0 :(得分:4)

std::shared_ptr<t>(ptr)getList(key)之间的执行顺序未在以下位置指定:

this->getList(key).addNew(std::shared_ptr<t>(ptr));

它可能会从一个编译器变为另一个,甚至从一个调用变为另一个。

C ++ 17为评估顺序添加了更多规则;自此版本起,您应该保证预期的评估顺序。