这两种return有什么区别?

What is the difference between these two types of return?

我有空 class(仅举个例子):

class A { ; };

我尝试了两种类型的在函数中创建新的 A class 对象和 return 这个:
1)

A getA1()
{
    A a;
    return a;
}

2)

A getA2()
{
    A* a = new A;
    return *a;
}

如果我得到相同的结果,它们之间有什么区别?

这个问题实际上可以深入研究 C++ 中内存管理的可怕内部工作原理。不知道大家对这些有多少了解,所以我尽量通俗易懂地回答一下。

从表面上看,这两个函数做同样的事情。您构建一个新对象,然后 return 该对象。但是,两者之间的主要区别在于 这些对象的存储位置。

在第一个示例中,您所做的是 return复制您之前在函数中创建的对象 A。 (如果您知道什么是复制构造函数,那么当您 运行 return a; 时就会调用它。)对此有一些注意事项(如果您有兴趣,请查找 "copy elision"),但是您应该认为这只是 returning 一个普通的旧对象,它与您声明的任何其他变量没有什么不同。

但是,在第二个示例中,您动态分配 一个名为 a 的新对象。像这样分配的对象存储在中,而不是在中,任何分配的对象最终都需要去-分配。如果不是,则会导致内存泄漏。假设这个程序的用户在程序退出之前会知道或记住 delete 这个变量是不安全的,所以 return 这样一个动态分配的指针几乎不是一个好主意。

tl;dr 第二个有能力破坏你电脑的 RAM。

如果您想了解更多差异并且不熟悉 C++ 中的内存,您一定要研究一下 "C++ pointers"。