加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用unique_ptr和shared_ptr进行奇怪的段错误

发布时间:2020-12-16 10:31:29 所属栏目:百科 来源:网络整理
导读:我遇到了一个奇怪的段错误.原因实际上导致我一个错误,但我仍然不明白为什么在这里引起分段错误……代码是: #include memoryint main(int argc,char **arv){ int *i = new int; std::unique_ptrint u1(i); std::unique_ptrint u2; u1 = std::move(u2); // li
我遇到了一个奇怪的段错误.原因实际上导致我一个错误,但我仍然不明白为什么在这里引起分段错误……代码是:

#include <memory>
int main(int argc,char **arv)
{
    int *i = new int;
    std::unique_ptr<int> u1(i);
    std::unique_ptr<int> u2;
    u1 = std::move(u2); // line 7
    std::shared_ptr<int> s1(i); // line 8
    std::shared_ptr<int> s2;
    s2 = s1;
}

我使用g 4.6和-std = c 0x编译并获得段错误.

如果我将第7行更改为u2 = std :: move(u1); (那是虫子)它消失了.
如果我将第8行更改为std :: shared_ptr< int> s1(new int(3)); (当然我不想要)它也消失了.如果我从第8行删除也没有段错误.

所以没有伤害,但我不明白为什么会有段错误.据我所理解,
在第7行中,一个空指针被分配给u1.没有重置(),没有范围的结束.不过从那以后我似乎无效.是有意的吗?这意味着在移动指针时必须非常小心,因为另一个对象可能被破坏!

你怎么看?我如何保护自己免受这种伤害?

谢谢,斯蒂芬

解决方法

你的第8行是错误的:一旦你在unique_ptr中捕获我,你就不能再把它交给其他一些所有权对象了!每个所有者都会尝试删除* i,这是错误的.

相反,您应该从唯一指针创建共享指针:

std::shared_ptr<int> s1(std::move(u2));

(另外,你的u1和u2方向错误.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读