我有以下简单的代码,我还没有找到一个线程,其中智能指针用于这种简单的情况,而是复制对象:
int main()
{
int i = 1;
std::unique_ptr<int> p1(&i);
*p1 = 2;
return 0;
}
当指针超出范围时,这会导致 _BLOCK_TYPE_IS_INVALID
。如果我调用 p1.release()
,代码工作正常并且我没有收到此错误。我认为这样的指针足够智能来处理悬挂指针?
另一种方法是,如果我有一份 i,它不会给出上述错误:
std::unique_ptr<int> p1(new int(i));
这里使用智能指针有什么好处,我不想执行本地复制?
如果我要使用原始指针:
int i = 1;
int *p1 = &i;
*p1 = 2;
我不会得到错误,即使我不编码:
p1 = nullptr;
最佳答案
std::unique_ptr
用于处理动态分配的内存;据说当您构造指针时,它们取得指针的所有权。
您的 int i;
在堆栈上,因此不是动态分配的;它的所有权不能从堆栈中拿走。当 unique_ptr
析构函数试图 delete
您给它的指针时(因为它认为没有人再拥有它),您会收到该错误,因为 delete
可以仅用于使用 new
创建的指针。
鉴于您的简短示例,我不知道这是在什么上下文中......但是您应该为堆栈分配的变量使用原始指针(或如您所说的制作拷贝)。
关于c++ - 智能指针 - 堆栈分配变量的 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41254412/