【问题标题】:if I return a class in my function, where does it store?如果我在函数中返回一个类,它存储在哪里?
【发布时间】:2019-05-28 05:59:09
【问题描述】:

看看我的代码:

#include <iostream>
using namespace std;
class MyClass{
public:
    char ch[50] = "abcd1234";
};
MyClass myFunction(){
    MyClass myClass;
    return myClass;
}
int main()
{
    cout<<myFunction().ch;
    return 0;
}

我不明白我的返回值存储在哪里?它存储在堆栈中吗?在堆里?在我的程序完成之前它会一直保留在内存中吗?

如果它存储在堆栈中,我可以确定我的类值永远不会改变吗?

请解释这些返回的机制。如果返回结构与返回类不同?

【问题讨论】:

  • C++中struct和class之间唯一的区别是默认访问级别(struct为public,class为private)
  • @Borgleader 还有默认继承。结构为公共,类为私有。
  • @NeilButterworth ITYM 对父类的默认访问级别 ;)
  • @Borgleader 不,我不是那个意思。

标签: c++ function return stack nrvo


【解决方案1】:

MyClass myClass; 存储在堆栈中。在myFunction() 退出后立即销毁。

当您return 它时,会在堆栈上创建一个副本。此副本一直存在到封闭表达式的末尾:cout &lt;&lt; myFunction().ch;


请注意,如果您的编译器足够聪明,则根本不应该创建第二个对象。相反,第一个对象将一直存在到封闭表达式的末尾。这称为NRVO命名为返回值优化

另请注意,标准没有定义“堆栈”。但在这种情况下,任何常见的实现都将使用堆栈。


如果返回结构与返回类不同?

C++ 中没有结构;关键字struct 创建类。 classstruct 之间的唯一区别是默认成员访问权限,因此答案是“否”。

【讨论】:

  • 我认为函数给的堆栈内存应该在返回后释放。
【解决方案2】:

找到一个合理的位置来存储该值取决于实现。虽然它通常在堆栈上,但语言定义对它的实际存储位置没有任何要求。返回的值是一个临时对象,它在创建它的完整语句的末尾被销毁;也就是说,它在调用myFunction() 的行末尾的; 处被销毁。

【讨论】:

    【解决方案3】:

    当您在任何函数中创建对象时,它会在函数执行完成后立即销毁,就像在变量中一样。 但是,当您从函数返回一个对象时,首先编译器会在名为 unnamed_temporary 的堆中创建该对象的本地实例,然后销毁您创建的对象。并随叫随到复制 unnamed_temporary 的内容。然后它也破坏了这个未命名的 _temporary。 您创建的没有关键字 new 的任何内容都将在堆栈中创建。 是的,除非您访问该变量并自己更改它,否则您的变量 ch 的内容不会改变。

    【讨论】:

      【解决方案4】:

      myFunction返回的实例是临时的,当它不再有用时就消失了,所以在cout &lt;&lt;...之后就不存在了。只需添加一个析构函数,您就会看到它何时被调用。

      你是什么意思我可以确定我的班级价值观永远不会改变吗??您将获得实例的副本

      返回结构不同于返回类? : struct 就像一个 class,默认情况下所有都是公共的,这是唯一的区别。

      【讨论】:

        【解决方案5】:

        您的函数正在返回一个对象的副本。它将存储在内存中的堆栈中。 返回的对象。将存在直到该功能的范围。之后,它将被销毁。然后,您的表达式 cout&lt;&lt;function(); 也将具有该 obj 的副本。由函数返回。运行此cout&lt;&lt;function(); 表达式后,IT 将被彻底销毁。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-04
          • 1970-01-01
          • 2018-11-09
          • 1970-01-01
          • 2017-09-11
          • 2019-03-22
          • 2010-12-11
          相关资源
          最近更新 更多