1

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

5 回答 5

7

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

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

// Use refFoo

这是不好的。引用只是指在别处创建的对象。在这个例子中,*fooref是完全相同的对象。一旦你通过做破坏了那个对象,它delete foo;就会ref悬空。它指的是一个不再存在的对象。访问它会导致未定义的行为。

于 2013-03-08T13:00:51.377 回答
4

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


* 但是,引用不是指针

于 2013-03-08T12:58:54.500 回答
1

除了您的示例甚至不接近正确的 C++ 并且它们都不会编译这一事实之外,对已删除的对象进行操作是永远不可能的

于 2013-03-08T12:58:01.000 回答
1

当您删除一个对象时,它就消失了。任何引用该对象(指针、引用)的东西都变得无效。

于 2013-03-08T13:02:08.983 回答
0

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

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

于 2013-03-08T12:59:58.157 回答