C++ C++;为什么在访问对共享\u ptr的已删除堆数据的引用时没有SEGFULT

C++ C++;为什么在访问对共享\u ptr的已删除堆数据的引用时没有SEGFULT,c++,segmentation-fault,shared-ptr,C++,Segmentation Fault,Shared Ptr,考虑一下这个片段: #include <memory> #include <iostream> struct A { const int& getv() { return v; } int v{42}; }; struct Shared { Shared(std::shared_ptr<A> someA) : intRef{someA->getv()} {

考虑一下这个片段:

#include <memory>
#include <iostream>

struct A
{
    const int& getv()
    {
        return v;
    }
    
    int v{42};
};

struct Shared
{
    Shared(std::shared_ptr<A> someA)
    : intRef{someA->getv()}
    {
    }
    
    const int& intRef;
};

Shared createShared()
{
    auto sharedA = std::make_shared<A>();
    return Shared(sharedA);
}

int main()
{
    auto shared = createShared();
    std::cout <<"Value of intRef " << shared.intRef;
    
    return 0;
}
#包括
#包括
结构A
{
常量int&getv()
{
返回v;
}
int v{42};
};
结构共享
{

共享(std::shared_ptr,其中不应引用智能指针后面的内容?

错误是上帝的祝福。它们会毫无疑问地告诉你什么时候出了问题。但上帝是任性的。有时他们会坐下来嘲笑我们致命的失败。永远不要指望错误。它们几乎总是如此未定义行为的结果,而未定义行为的行为是未定义的。但实际上,当程序释放内存时,底层系统很少立即回收内存。程序可能会再次请求它,计算机可能还不需要它来做任何其他事情,所以为什么要浪费时间回收它。许多、更多的这就是为什么你仍然可以访问内存。你只是不能安全地这样做。在几层模糊的图片后面,
createShared()
实际上返回一个对局部变量的引用。它与
int&dontdoathis(){int v=42;return v;}
。当讨论内存释放后的情况时,内存来自何处(自动或动态存储)并不重要。如果使用引用指针,则需要确保其生命周期至少与引用对象的生命周期相同。否则,如果使用共享的\u ptr,则可能会得到弱指针。