这两种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"。
我有空 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"。