-1

看看我的代码:

#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;
}

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

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

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

4

5 回答 5

2

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

当你return这样做时,会在堆栈上制作一个副本。此副本一直存在到封闭表达式的末尾:cout << myFunction().ch;


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

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


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

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

于 2018-12-31T22:51:47.023 回答
1

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

于 2019-01-01T00:07:23.723 回答
1

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

于 2018-12-31T22:48:14.120 回答
1

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

于 2018-12-31T22:50:32.093 回答
1

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

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

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

于 2018-12-31T22:51:50.123 回答