【发布时间】:2020-08-31 04:08:46
【问题描述】:
#include <string>
#include <iostream>
class Type {
public:
int x;
Type(int a)
{
x = a;
}
Type(const Type& type1)
{
std::cout << "copy" << std::endl;
}
};
Type Func()
{
Type s(1);
std::cout << &s << std::endl;
return s;
}
int main()
{
Type c = Func();
std::cout << &c << std::endl;
std::cout << c.x << std::endl;
system("pause");
}
C++ 为堆或堆栈中的对象分配内存?在 Func 中,假设“s”是在栈中分配的,那为什么不解构呢?为什么我仍然可以在 main() 中调用它。我很困惑。
【问题讨论】:
-
有趣的事实:C++ 的设计目的是让您不需要堆或堆栈。最好用动态和自动分配来表述这个问题。如果编写正确,这些将是您的 C++ 编程文本中使用的术语。
-
向
Type添加一个析构函数,并在其中放置一个诊断输出,以便您可以看到它何时被调用。示例:ideone.com/n8teQN -
函数中的 &s 被解构并返回一个副本,该副本在 main() 中使用。如上所述,定义一个析构函数来观察这一点。
-
您可能会在这里感到困惑的是a compiler will do anything it can to your code to make it run faster,这包括丢弃不必要的复制。现代 C++ 编译器中的Copy Elision 规则甚至允许消除对复制构造函数的调用,即使存在诸如打印语句之类的可见副作用。例如,它可以静默获取
c并通过引用将其传递给func并将其用作s,从而无需构造s并将其复制回c -
虽然它通过输出未初始化的变量导致未定义的行为(复制构造函数没有初始化
x)