智能指针 - 用于堆栈分配变量的unique_ptr

c0d*_*der 3 c++ smart-pointers unique-ptr

我有以下简单的代码,我还没有找到一个线程,其中智能指针用于这个简单的情况,而是复制对象:

int main()
{
    int i = 1;

    std::unique_ptr<int> p1(&i);
    *p1 = 2;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

_BLOCK_TYPE_IS_INVALID当指针超出范围时,会导致这种情况.如果我打电话p1.release(),代码工作正常,我不会得到这个错误.我认为这样的指针很聪明,可以处理悬空指针?

另一种方法是,如果我有i的副本,则不会出现上述错误:

std::unique_ptr<int> p1(new int(i));
Run Code Online (Sandbox Code Playgroud)

在这里使用智能指针有什么好处,我不想执行本地副本?

如果我要使用原始指针:

int i = 1;
int *p1 = &i;
*p1 = 2;
Run Code Online (Sandbox Code Playgroud)

即使我不编码,我也不会收到错误:

p1 = nullptr;
Run Code Online (Sandbox Code Playgroud)

qxz*_*qxz 11

std::unique_ptrs用于处理动态分配的内存; 当你构造一个时,他们被认为拥有指针的所有权.

int i;是在堆栈上,因此不是动态分配的; 它的所有权不能从堆栈中拿走.当unique_ptr析构函数尝试delete使用你给它的指针时(因为它认为没有人拥有它),你会得到该错误,因为delete它只能用于创建的指针new.

给出你的简短例子,我不知道它在哪个上下文...但是你应该使用原始指针(或者如你所说的那样复制)用于堆栈分配的变量.

  • 使用 [`=`](http://www.cplusplus.com/reference/memory/unique_ptr/operator=/) 分配 `unique_ptr` 基本上与调用 [`reset`](http://www.cplusplus.com/reference/memory/unique_ptr/operator=/) 相同。 cplusplus.com/reference/memory/unique_ptr/reset/),并销毁先前持有的指针。使用 [`release`](http://www.cplusplus.com/reference/memory/unique_ptr/release/) 放弃指针的所有权,而不破坏它。 (2认同)