我知道这可能已经被问过了,并且我已经查看了其他答案,但我仍然无法完全理解。我想了解以下两个代码之间的区别:
MyClass getClass(){
return MyClass();
}
和
MyClass* returnClass(){
return new MyClass();
}
现在假设我在 main 中调用这些函数:
MyClass what = getClass();
MyClass* who = returnClass();
如果我明白这一点,在第一种情况下,在函数范围内创建的对象将具有自动存储功能,即当您退出函数范围时,其内存块将被释放。此外,在释放此类内存之前,返回的对象将被复制到我创建的“what”变量中。所以只会存在一个对象的副本。我对么?
1a。如果我是正确的,为什么需要 RVO(返回值优化)?
在第二种情况下,对象将通过动态存储分配,即它甚至存在于函数范围之外。所以我需要使用
delete
它。该函数返回一个指向此类对象的指针,因此这次没有复制,执行delete who
将释放先前分配的内存。我(希望)是正确的吗?我也知道我可以做这样的事情:
MyClass& getClass(){ return MyClass(); }
然后主要是:
MyClass who = getClass();
通过这种方式,我只是告诉“谁”与在函数中创建的对象是同一个对象。不过,现在我们已经超出了函数范围,因此该对象不一定不再存在。所以我认为应该避免这种情况以避免麻烦,对吗?(同样适用于
MyClass* who = &getClass();
这将创建一个指向局部变量的指针)。
奖励问题:我认为到目前为止所说的任何内容在返回时也是正确vector<T>
的(例如,vector<double>
),尽管我错过了一些片段。我知道一个向量是在堆栈中分配的,而它包含的东西在堆中,但是使用vector<T>::clear()
足以清除这样的内存。现在我想遵循第一个过程(即按值返回一个向量):当向量将被复制时,它包含的对象也将被复制;但退出函数范围会破坏第一个对象。现在我拥有了无处包含的原始对象,因为它们的向量已被破坏,并且我无法删除仍在堆中的此类对象。或者也许 aclear()
是自动执行的?
我知道我可能会在这些主题(特别是在矢量部分)中存在一些误解,所以我希望你能帮助我澄清它们。