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谢谢你给了我第一个实际的上下文注释,而不是对他们错过了一半上下文的代码做出尖刻的注释。