gpt4 book ai didi

C++ 来自同一个原始指针的多个唯一指针

转载 作者:可可西里 更新时间:2023-11-01 18:35:26 28 4
gpt4 key购买 nike

考虑下面的代码。我对唯一指针的理解是只能使用一个唯一指针来引用一个变量或对象。在我的代码中,我有多个 unique_ptr 访问同一个变量。

这显然不是我所知道的使用智能指针的正确方法,因为指针从创建时就应该拥有完整的所有权。但是,为什么这是有效的并且没有编译错误?谢谢。

#include <iostream>
#include <memory>

using namespace std;

int main()
{
int val = 0;
int* valPtr = &val;

unique_ptr <int> uniquePtr1(valPtr);
unique_ptr <int> uniquePtr2(valPtr);

*uniquePtr1 = 10;
*uniquePtr2 = 20;

return 0;
}

最佳答案

But still, why is this valid

有效!这是未定义的行为,因为 std::unique_ptr 的析构函数将释放一个具有自动存储持续时间的对象。

实际上,您的程序会尝试三次销毁 int 对象。首先通过 uniquePtr2,然后通过 uniquePtr1,然后通过 val 本身。

and not having a compilation error?

因为此类错误在编译时通常检测不到:

unique_ptr <int> uniquePtr1(valPtr);
unique_ptr <int> uniquePtr2(function_with_runtime_input());

在此示例中,function_with_runtime_input() 可能会执行许多复杂的运行时操作,最终返回指向同一对象的指针 valPtr 指向。


如果您正确使用 std::unique_ptr,那么您几乎总是会使用 std::make_unique,这可以防止此类错误。

关于C++ 来自同一个原始指针的多个唯一指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49334967/

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