程序在将局部变量地址传递给 C++ 中的共享指针时崩溃
Program crashes on passing local variable address to shared pointer in c++
#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
* Error in `./a.out': free(): invalid pointer: 0xbfc7f13c *
Aborted (core dumped)
为什么会这样?我认为删除 NULL
指针是安全的,但这不是好的编码习惯。
当 ptr
超出范围时,shared_ptr
将尝试删除 localVariable
。但是,localVariable
不是堆分配的(通过 new
),所以它不能被删除(它的内存是由堆栈自动管理的)。
#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 * Error in `./a.out': free(): invalid pointer: 0xbfc7f13c *
Aborted (core dumped)
为什么会这样?我认为删除 NULL
指针是安全的,但这不是好的编码习惯。
当 ptr
超出范围时,shared_ptr
将尝试删除 localVariable
。但是,localVariable
不是堆分配的(通过 new
),所以它不能被删除(它的内存是由堆栈自动管理的)。