C++ 为什么';这不是悬挂的std::弱ptr导致SEGFULT吗?

C++ 为什么';这不是悬挂的std::弱ptr导致SEGFULT吗?,c++,weak-ptr,C++,Weak Ptr,在下面的代码中,我在作用域中创建了一个共享\u ptr,并将其分配给一个弱\u ptr。为什么在运行代码时我没有得到SEGFAULT,因为wp在范围之外应该是无效的,对吗 namespace { struct Dummy { int x; void foo() { std::cout << "dummy created\n"; } ~Dummy() {

在下面的代码中,我在作用域中创建了一个
共享\u ptr
,并将其分配给一个
弱\u ptr
。为什么在运行代码时我没有得到SEGFAULT,因为
wp
在范围之外应该是无效的,对吗

namespace {
    struct Dummy {
        int x;
        void foo() {
            std::cout << "dummy created\n";
        }
        ~Dummy()
        {
            std::cout << "dummy destroyed\n";
        }
    };
}
TEST(experimental, ptr_test){
    std::weak_ptr<Dummy> wp;
    {
        auto sp = std::make_shared<Dummy>();
        wp = sp;
    }
    wp.lock()->foo();
};
名称空间{
结构虚拟{
int x;
void foo(){

std::cout一般来说,除非您实际使用无效内存执行某些操作,否则不会出现segfault(然后它也不会总是segfault-由硬件向操作系统发送信号,然后由操作系统实际使程序崩溃)如果您在 Foo中设置了 X/CODE >,您可能有更好的机会看到Sebug——但是正如USER(3157112)指出的,C++标准不能保证无效代码的分段错误。

< P>您实际上并没有取消任何内容。如果被锁定的SyrdpPTR是NUL,则锁定方法仍然会返回SyrdypTR。l、 但共享的_ptr也将为null。在本例中,foo不会在我的编译器上崩溃,因为它从未取消引用null指针,但它是未定义的行为,因此您永远不知道会发生什么。但是,bar将始终崩溃,因为它需要取消引用指针才能到达x

发生这种情况的原因是,所有成员函数都编译为普通函数,这些函数将指向对象的指针作为可从函数体访问的第一个参数,如this。如果函数体中没有任何内容取消引用this,则在nullptr上调用此函数可能大部分时间都有效。但不应这样做,将来的编译器更改或另一个体系结构的端口可能会导致此崩溃

#include <iostream>
#include <memory>

struct Dummy {
   int x;
   Dummy()
      : x(10) {
      std::cout << "Dummy created" << std::endl;
   }

   ~Dummy() {
      std::cout << "Dummy destroyed" << std::endl;
   }

   void foo() {
      std::cout << "foo" << std::endl;
   }

   void bar() {
      std::cout << x << std::endl;
   }
};

int main() {
   std::weak_ptr<Dummy> wp;
   {
      auto sp = std::make_shared<Dummy>();
      wp = sp;
   }

   auto locked = wp.lock();
   if(locked.get() == nullptr) {
      std::cout << "Locked pointer is null" << std::endl;
   }

   locked->foo();             // Does not crash
   ((Dummy*)nullptr)->foo();  // Does not crash
   locked->bar();             // Will crash
}
#包括
#包括
结构虚拟{
int x;
伪()
:x(10){

STD::CUT C++不保证无效代码会被分割。它是UB去引用空指针。因为“代码> FoO 的定义根本不使用<代码> < <代码>,编译器忽略它。“真的无效”。不是一个有用的表达式。另一个答案更清楚地说明了此代码是否存在segfault。Stack overflow的读者想要的是具体的、信息性的答案,而不是向非技术读者提供的解释。还有“C++不保证存在segfault…”C++不只是保证,它根本没有信号的概念。它可以分段,或出现工作,或召唤。谢谢,我已经更新我的答案,包括和软化我的语言(不,而不是不会)。