程序在c ++中将局部变量地址传递给共享指针时崩溃

时间:2016-12-14 17:49:26

标签: c++ c++11 shared-ptr

#include <iostream>
#include <memory>

using namespace std;

void func ()
{
    cout << "func\n";
    int localVariable = 10;
    int* p = new int;
    shared_ptr<int> ptr (&localVariable); 
    shared_ptr<int> ptr1 (new int); 
    shared_ptr<int> ptr2 (p); 
}

int main ()
{
    func();
    return 0;
}

我尝试将堆分配的内存直接传递给shared_ptr,并尝试了之前分配的一些指针,编译和运行成功。 但是当我试图将局部变量的地址传递给shared_ptr时,它崩溃了下面的堆栈:

  

vidhu @~ / Documents / CPP_Practice $ ./a.out func    *`./a.out':free()错误:指针无效:0xbfc7f13c *

     

中止(核心倾销)

为什么会这样?我认为删除NULL指针是安全的,但这不是很好的编码实践。

1 个答案:

答案 0 :(得分:2)

shared_ptr超出范围时,localVariable会尝试删除ptr。但是,localVariable未分配堆(通过new),因此无法删除(并且其内存由堆栈自动管理)。