Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;为什么前面的步骤引发异常时std::shared_ptr的指针引用会被破坏_C++ - Fatal编程技术网

C++ c++;为什么前面的步骤引发异常时std::shared_ptr的指针引用会被破坏

C++ c++;为什么前面的步骤引发异常时std::shared_ptr的指针引用会被破坏,c++,C++,目前,我在std::unordered_map中有一个自己版本的链表(其中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::s

目前,我在
std::unordered_map
中有一个自己版本的链表(其中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));
    }
}
void addTo(常量键和键,t*ptr)
{
如果(ptr==NULL ptr | | ptr==NULL){
抛出“我使用的不是真正的异常”
}
尝试
{
这个->getList(key).addNew(std::shared_ptr(ptr));
}
捕捉(标准:超出范围)
{
这->添加列表(键,(std::shared_ptr(ptr));
}
}
然而,我最近注意到,当getList抛出out_of_range异常时(如果映射中没有这样的键,它总是这样),ptr就会被删除。现在,如果在调用getList之前创建共享的ptr是有意义的,但为什么会这样呢

我通过简单地将this->getList和addNew分开来验证这一点,如下所示:

const List<shared_ptr<t>> l& = this->getList(key);
l.addNew(etc etc);
const List l&=this->getList(键);
l、 新增(等);
这样写时,指针不会发生任何变化

这使我得出结论,SyrdypTR首先被创建,这意味着C++进程先对我进行初始化,这并没有产生很多意义。


< C++ >执行这些语句的顺序是什么?为什么不在-> GETLIST之后实例化SyrdY-PTR(是什么原因来做不同的事情)?< <强> > /P> < P> <代码> STD::SyrdYPPTR(PTR)< /C>和<代码> GETLIST(KEY)< /C> >未指定在:

this->getList(key).addNew(std::shared_ptr<t>(ptr));
this->getList(key).addNew(std::shared_ptr(ptr));
它可能会从一个编译器更改为另一个编译器,甚至从一个调用更改为另一个调用


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

std::shared_ptr(ptr)
getList(key)
之间的执行顺序未在以下内容中指定:

this->getList(key).addNew(std::shared_ptr<t>(ptr));
this->getList(key).addNew(std::shared_ptr(ptr));
它可能会从一个编译器更改为另一个编译器,甚至从一个调用更改为另一个调用


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

使用智能指针的想法,它可以用代码而不是文档来回答“谁拥有该资源?”。为了有效地使用智能指针,您需要学习资源属性管理。花一些时间来学习。创建ptr指向的对象的人也应该创建共享的\u ptr并将其传递给您的addTo()。使用共享的\u ptr的“无处不在”或者根本不使用它们。您始终需要保持至少一个对象的共享ptr处于活动状态。如果您对评估顺序和顺序感到疑惑,请参阅例如,以及(以及更高版本)@Someprogrammerdude感谢你给了我第一个实际的上下文注释,而不是对他们错过了一半上下文的代码进行尖刻的注释。使用智能指针的想法是用代码而不是文档来回答“谁拥有该资源?”。为了有效地使用智能指针,您需要学习资源属性管理。花一些时间来学习。创建ptr指向的对象的人也应该创建共享的\u ptr并将其传递给您的addTo()。使用共享的\u ptr的“无处不在”或者根本不使用它们。您始终需要保持至少一个对象的共享ptr处于活动状态。如果您对评估顺序和顺序感到疑惑,请参阅例如,以及(以及更高版本)@Someprogrammerdude谢谢你给了我第一个实际的上下文注释,而不是对他们错过了一半上下文的代码做出尖刻的注释。