gpt4 book ai didi

c++ - 为什么可以从另一个 unique_ptr get() 创建 unique_ptr 而不会导致错误?

转载 作者:行者123 更新时间:2023-12-05 08:24:41 28 4
gpt4 key购买 nike

我是 C++ 和智能指针的新手,尤其是 unique_ptr 的行为。下面是我正在试验的一段代码:

unique_ptr<int>  u1 = make_unique<int>(2);
unique_ptr<int> u2 = make_unique<int>();
u2.reset(u1.get());

unique_ptr,根据定义,是一种智能指针,它不与其他智能指针共享它指向的对象的所有权。但是,为什么上面的代码没有返回错误呢?事实上,如果我尝试打印 u1 和 u2 的值,结果它们确实指向相同的内存地址:

cout<<u1.get()<<endl;
cout<<u2.get()<<endl;

在控制台上显示这些:

0x55800839ceb0
0x55800839ceb0
free(): double free detected in tcache 2 // finally the error appears at the end of the program's execution

但是如果我说:

cout<<(*u1)<<endl;
(*u1)=5;
cout<<(*u2)<<endl;

更改不影响 (*u2),就好像它们在不同的内存地址中一样。

任何帮助将不胜感激!感谢您的宝贵时间!

最佳答案

只要您调用get(),您就有了一个原始指针。它只是一个指针,它不包含标准库或语言可以保留或提供的重要所有权语义。

然后您使用该指针使第二个唯一指针获得所指向对象的所有权。它“认为”它拥有该对象的唯一所有权。这很好,只要唯一指针确实是唯一拥有该对象的东西。

不幸的是,第一个唯一指针仍然拥有同一个对象,因此当两个唯一指针都试图破坏该对象时,就会出现双重释放。这是未定义的行为,不保证在编译时 出现明确的错误消息。您可能会出现微妙的损坏、无声的崩溃,或者程序可能会在偶然的情况下悄无声息地成功。

但是, sanitizer 程序在启用时可以在运行时更可靠地显示明显的错误,因为它会主动寻找某些类型的未定义行为。这是一个 demo显示 ASan(地址 sanitizer )检测到这种双重释放,正如它设计的那样。

The change doesn't affect (*u2), as if they are in different memory addresses.

确实如此;看上面的演示打印 2 2 2 5 (u1, u2, u1 before updating, u1 更新后的 u2

关于c++ - 为什么可以从另一个 unique_ptr get() 创建 unique_ptr 而不会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74482897/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com