棧,是存在于某作用域的一塊內存空間。在函數體內聲明的任何變量,其所使用的內存空間均來自于棧。
堆,是指由操作系統提供的一塊global內存空間,程序可動態分配獲得若干內存空間塊。
new操作符生成的對象所占用的內存空間即是從堆中動態分配所得。
c1所占用的空間來自棧,c2來自堆。
c1在作用域結束之后消失,內存會被自動清理。
c2是heap object,其生命在被delete時結束,若其作用域結束,還沒有被delete,則c2所指向的heap object依然存在,但c2的生命結束了,作用域之外不再有c2,也就沒機會delete c2了,因此會產生內存泄漏
c3是static object,在作用域結束之后仍然存在,直到整個程序結束。
class Complex { … };
...
{
Complex c1(1,2);
Complex* c2 = new Complex(3);
static Complex c3(1,2);
}
new操作:先分配內存再調用構造函數
delete操作:先調用析構函數,再釋放內存
array new 一定要搭配 array delete