程序在将局部变量地址传递给 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),所以它不能被删除(它的内存是由堆栈自动管理的)。