【问题标题】:C++ reference on deleted objects已删除对象的 C++ 参考
【发布时间】:2013-02-24 00:38:47
【问题描述】:

我正在学习 C++(来自 iOS),我想了解指针/引用的用法。

在删除对象时使用对对象的引用是否正确?还是引用的变量也会被删除?

示例:

Class Foo {
}

Class Faa{
   asyncCall(&Foo)
}

1.

// ...
Foo *foo = new Foo();
faa->(asyncCall(&foo);
delete foo;
// ...

2.

// ...
Foo *foo = new Foo();
Foo& refFoo = foo;
delete foo;

// do something with refFoo

【问题讨论】:

  • 这不是真正的代码。 Class 拼写错误,并且您缺少分号。
  • ...还有括号等...
  • 这个asyncCall(&Foo) 在你放置它的上下文中也没有任何意义。

标签: c++ object reference


【解决方案1】:

除了您的示例甚至不接近正确的 C++ 并且它们都无法编译之外,对已删除的对象进行操作是绝对不行的

【讨论】:

    【解决方案2】:

    C++ 中的引用与 Java、C# 或其他垃圾回收语言中的引用不同:对于大多数实际用途,您可以将 C++ 引用视为不需要取消引用的指针*。创建对对象的引用不会延长其生命周期。这就是为什么通过引用访问已删除的对象与通过第二个指针访问已删除的对象相比更不行的原因:这是未定义的行为。


    *References are not pointers, though

    【讨论】:

      【解决方案3】:

      & 可以表示引用(如声明 asyncCall(&Foo) - 您错过了返回值和参数的数据类型)或获取地址(如 asyncCall(&foo))。

      拥有一些几乎类似于 C++ 并且更好地编译的代码也会有所帮助。

      【讨论】:

        【解决方案4】:

        由于您的代码示例是胡言乱语,我将提出自己的:

        Foo* foo = new Foo();
        Foo& ref = *foo;
        delete foo;
        
        // Use refFoo
        

        这很糟糕。引用只是指在别处创建的对象。在此示例中,*fooref 是完全相同的对象。一旦您销毁该对象,通过执行delete foo;ref 就会悬空。它指的是一个不再存在的对象。访问它会导致未定义的行为。

        【讨论】:

          【解决方案5】:

          当你删除一个对象时,它就消失了。引用该对象(指针、引用)的任何内容都将变为无效。

          【讨论】:

            猜你喜欢
            • 2017-08-02
            • 1970-01-01
            • 1970-01-01
            • 2016-07-25
            • 1970-01-01
            • 2013-07-28
            • 2020-06-01
            • 2017-04-07
            • 2012-01-20
            相关资源
            最近更新 更多