比方說,你有這樣的代碼:
#include <iostream>
using namespace std;
class MyClass
{
public:
int *v;
MyClass()
{
v=new int[5];
for(int i=0;i<5;i++) v[i]=i; // x will look like : 0,1,2,3,4
}
~MyClass()
{
cout<<"Destructor called! Now v is deallocated! \n";
delete[] v;
}
};
MyClass myFunction()
{
MyClass mc;
return mc;
}
int main()
{
MyClass x;
x=myFunction();
cout<<x.v[2]<<'\n'; //it may or may not print the right thing
return 0;
}
正如你所看到的,myFunction
像你說的返回對象mc
。但是你也知道mc
的析構函數將在mc
超出範圍時被調用 - mc
在myFunction
內聲明,所以析構函數將在函數執行後被調用並釋放內存(delete[] v
)。內存被釋放,但值仍然在內存中!所以,儘管x=myFunction();
可以工作,但您將有一個內存v指向的對象被釋放!所以,cout<<x.v[2]<<'\n';
可能不打印正確的東西。如果你編譯代碼,它會可能打印正確的值(2),因爲內存沒有被覆蓋,但如果你要在cout語句之前做一些更多的分配,或者在使用你的操作系統一段時間後,你會看到打印的值不正確/崩潰,因爲內存將被其他程序覆蓋。 v
仍然指向那個內存塊,但它不知道那裏有什麼,因爲內存被解除分配。
內myFunction
:V> - |0|1| 2 |3|4|...
退出myFunction
後:V> - |0|1| 2 |3|4|.....
一些內存分配後:V> - |a|1| b |@|%|3|7|2|1|*|!|......
NRVO(命名返回值優化)複製構造函數的elides(應用時)。 – Jarod42
https://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization – CoryKramer
並移動構造函數(如果可用)完成此舉。我認爲,這個講座非常過時,而且根本不清楚。 – SergeyA