C++学习笔记
提示:本笔记是个人学习侯捷C++课程的总结笔记,欢迎来信指正批评!
第一篇 拷贝构造、拷贝赋值、析构
第二篇 堆、栈与内存管理
提示:以下是本篇文章正文内容,下面案例可供参考
堆、栈
栈(Stack)是存在于某作用域的一块内存空间,当调用函数时,函数本身也会形成一个stack放置接收的参数,以及返回地址。在函数本体内申明的任何变量,其所使用的内存块都是stack。
堆(Heap)是指由操作系统提供的一块global内存空间,程序可动态分配从中获得若干块。
class Complex { …… };
……
{
Complex c1(1,2); /*存储在Stack中,离开作用域后该内存释放,析构被调用*/
static Complex c2(1,2); /*静态变量在作用域结束之后仍然存在,直到整个程序结束*/
Complex* p = new Complex(3); /*存储在heap中,需要手动释放delete,否则指针消亡,但是内存未释放*/
delete p; /*delete调用complex析构函数,防止内存泄漏*/
}
Complex c3(1,2); /*全局对象*/
int main()
{
}
内存分配
new所作的操作具体为:
Complex* pc = new Complex(1,2);
/*等价于*/
Complex* pc;
void* mem = operator new (sizeof(Complex)); /*调用malloc(n),分配内存*/
pc = static_cast<Complex*>(mem); /*转型,将mem从void转化为Complex*/
pc->Complex::Complex(1,2);
内存释放
delete所作的操作具体为:
delete pc;
/*等价于*/
Complex::~Complex(pc); /*调用析构函数*/
operator delete(pc); /*释放内存,其内存调用free(pc)*/
总结
1.创建对象的时效,根据对象类型不同而不同。内联函数创建会在作用域之后自动释放,new创建需要手动delete释放,static会一直到程序结束。
2.delete与new连用;new []与delete[]连用,防止内存泄漏。