C++ 堆、栈相关问题

c++相关技术积累文档


1.stack(栈)、heap(堆)

Stack,是存在于某作用域(scope)的一块内存空间(memory space)。例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址。

在函数本体(function body)内声明的任何变量,其所使用的内存块都取自上述stack。

Heap,或谓system heap,是指由操作系统提供的一块global内存空间,程序可动态分配(dynamic allocated)从某种获得若干区块(blocks)。

class Complex	{...};
...
{
	Complex c1(1,2);				//c1所占用的控件来自stack
	Complex* p = new Complex(3);	//Complex(3)是个临时对象,其所占用的空间乃是以new自heap动态分配而得,并由p指向
}

1.1 stack objects的生命周期

class Complex  {...};
...
{
	Complex c1(1,2);
}

c1便是所谓stack object,其生命在作用域(scope)结束之际结束。这种作用域内的object,又称为auto object,因为它会被自动清理,即它的析构函数会被自动地调用起来。

1.2 static local objects的生命周期

class Complex {...}
...
{
	static Complex c2(1,2);
}

c2即所谓static object,其生命在作用域(scope)结束之后仍然存在,直到整个程序结束。

1.3 global objects的生命周期

Complex c3(1,2);
int main()
{
	...
}

c3便是所谓global object,其生命在这个程序结束之后才结束。你也可以把它视为一种static object,其作用域是整个程序

1.4 heap objects的生命周期

class Complex  {...};
...
{
	Complex* p = new Complex;
	...
	delete p;
}

p所指的便是heap object,其生命在它被deleted之际结束。

class Complex  {...};
...
{
	Complex* p = new Complex;
}

以上出现内存泄漏(memory leak)因为当作用域结束,p所指向的heap object仍然存在,单指针p的生命周期结束了,作用域之外再也看不到p(也就没机会delete p)。

2.new、delete

new :先分配memory,再调用构造函数ctor。
delete :先调用析构函数dtor,再释放memory。

array new 一定要搭配 array delete

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wang_chao118

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值