Eng*_*999 8 c++ pointers unique-ptr c++11
考虑下面的代码.我对唯一指针的理解是只能使用一个唯一指针来引用一个变量或对象.在我的代码中,我有多个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;
}
Run Code Online (Sandbox Code Playgroud)
但是,为什么这是有效的
它是不是有效的!它是未定义的行为,因为析构函数std::unique_ptr将释放具有自动存储持续时间的对象.
实际上,您的程序试图破坏int对象三次.首先uniquePtr2,然后通过uniquePtr1,然后通过val自己.
并没有编译错误?
因为在编译时通常无法检测到此类错误:
unique_ptr <int> uniquePtr1(valPtr);
unique_ptr <int> uniquePtr2(function_with_runtime_input());
Run Code Online (Sandbox Code Playgroud)
在这个例子中,function_with_runtime_input()可以执行许多复杂的运行时操作,最终返回指向同一对象的指针valPtr.
如果使用std::unique_ptr正确,那么您几乎总是会使用std::make_unique,这可以防止此类错误.
这个代码示例有点人为。unique_ptr在现实世界的代码中通常不会以这种方式初始化。使用std::make_unique或初始化unique_ptr而不将原始指针存储在变量中:
unique_ptr <int> uniquePtr2(new int);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2554 次 |
| 最近记录: |