0

这就是我所相信的:

当一个函数返回时,它会为该对象创建一个新的临时副本,并且该临时对象在调用它的语句期间保留在内存中。

当函数返回引用时,该对象本身也会返回。这意味着该对象不应该是本地的。

所以当我这样做时:

 MyStruct & ReferenceReturn(MyStruct cl)
 {
         return cl;
 }

在 main() 我做

MyStruct d("notmyname"),g("myname");
d = ReferenceReturn(g);
cout << d.name;
cout << ReferenceReturn(g).name;

它在两者中都打印垃圾。

什么被退回?: 对 g 的本地副本的引用,即在函数完成后立即销毁的 cl 或对在语句结束后被销毁的临时对象的引用。但是因为如果 temp 被创建,它将以正确的方式覆盖 d。所以我相信它是返回的传递值的 localcopy 的引用。

但是,一旦我在结构中创建了析构函数,它就完美地运行了,并带有以下代码和特定的输出。

 ~MyStruct()
 {
   cout << name << " is destroying";
  }

输出:

myname is destroying
myname
myname
myname is destroying
.... 

此输出显示每次调用仅创建一个对象。(有两个电话)

但是为什么没有析构函数它不能工作?

谢谢

4

2 回答 2

2
 MyStruct & ReferenceReturn(MyStruct cl)
 {
         return cl;
 }

创建temporary object、赋值给cl、返回reference对象、销毁对象。所以,是dangling reference。编译器可以使用copy-elision和不复制对象,但不能...使用一些东西

 MyStruct & ReferenceReturn(MyStruct& cl)
 {
         return cl;
 }
于 2012-08-25T18:09:38.813 回答
1
 MyStruct & ReferenceReturn(MyStruct cl) {
    return cl;
 }

对于这种情况,结果是否未定义?

该函数表现出未定义的行为,是的。问题是这cl是函数中的一个本地对象,并且您正在返回对它的引用。这是未定义的行为。调用者将创建g要传递给的副本ReferenceReturn,并且该副本将被ReferenceReturn之后的函数销毁return,可能在调用者使用引用之前。

于 2012-08-25T18:26:11.830 回答