考虑下面我的代码。我对唯一指针的理解是,只能使用一个唯一指针来引用一个变量或对象。在我的代码中,我有多个 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;
}
但是,为什么这是有效的
It is not有效的!这是未定义的行为,因为析构函数std::unique_ptr
将释放具有自动存储期限的对象。
实际上,你的程序试图破坏int
反对三遍。首先通过uniquePtr2
,然后通过uniquePtr1
,然后通过val
itself.
并且没有编译错误?
因为此类错误通常在编译时无法检测到:
unique_ptr <int> uniquePtr1(valPtr);
unique_ptr <int> uniquePtr2(function_with_runtime_input());
在这个例子中,function_with_runtime_input()
可能会执行许多复杂的运行时操作,最终返回指向同一对象的指针valPtr
指着。
如果你使用std::unique_ptr
正确的话,那么你几乎总是会使用std::make_unique
,这可以防止此类错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)