#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
指针是安全的,但这不是很好的编码实践。
答案 0 :(得分:2)
当shared_ptr
超出范围时,localVariable
会尝试删除ptr
。但是,localVariable
未分配堆(通过new
),因此无法删除(并且其内存由堆栈自动管理)。