关于已删除对象的C ++参考

时间:2013-03-08 12:55:39

标签: c++ object reference

我正在学习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

5 个答案:

答案 0 :(得分:4)

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

<小时/> * References are not pointers, though

答案 1 :(得分:4)

由于您的代码示例是乱码,我将自己构建:

Foo* foo = new Foo();
Foo& ref = *foo;
delete foo;

// Use refFoo

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

答案 2 :(得分:1)

除了你的样本甚至没有接近正确的C ++并且它们都没有编译的事实之外,对删除的对象进行操作永远不行

答案 3 :(得分:0)

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

使用一些几乎类似于C ++的代码也会有所帮助。

答案 4 :(得分:0)

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