C++内存分配与复制构造函数笔试考察

去参加笔试了,有两道题做错了,都是印象里面有概念,但是没有弄清楚它到底是怎么回事,原理是什么,导致题目打错,现总结一下。

一、C++内存分配笔试考察

问题考察如下,请先不要看答案,看看你能否做对,呵呵:

C++内存分配与复制构造函数笔试考察

怎么样,晕了没?正确答案及解析如下:

C++内存分配与复制构造函数笔试考察

解析:char p[] = “...”是一个数组,这个数组是局部变量。char *p = “...”,是一个指针,这个指针指向一个字符串常量。区别在于:数组的话,字符串是存在这个数组里的,因为这个数组属于局部变量(存在栈区),而当该函数执行完,位于栈区的局部变量就销毁了,就算把数组的地址返回给主函数,主函数也无法访问到原有字符串了,应该输出乱码。但是,如果是指向字符串常量的指针,这个字符串是放在程序的常量区而不是放在局部变量中,那么把这个常量的地址返回给主函数,主函数也是可以访问它的。

下面就针对C++中的内存分配做个总结:

一个C/C++编译的程序占用的内存分为以下几个部分:

1. 栈区(stack)

由编译器自动分配释放,存放函数地址、函数参数值、局部变量的值等。

2. 堆区(heap)

就是那些由new分配的内存块,他们的分配与释放由程序员负责,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3. 全局/静态区(static)

全局变量和静态变量的存储是放在一块的,初始化的全局变量和初始化的静态变量在一块区域,为初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

4. 常量存储区(const)

常量字符串就是放在这里的。

5. 程序代码区

存放函数体的二进制代码。

其中,堆栈的主要区别如下:

爽歪歪了吧,下面就来看第二个问题吧。。。

C++内存分配与复制构造函数笔试考察

C++ 设计新思维》 下载见

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码

读C++ Primer 之构造函数陷阱

读C++ Primer 之智能指针

读C++ Primer 之句柄类

C语言梳理一下,分布在以下10个章节中:

Linux-C成长之路(一):Linux下C编程概要

Linux-C成长之路(二):基本数据类型

Linux-C成长之路(三):基本IO函数操作

Linux-C成长之路(四):运算符

Linux-C成长之路(五):控制流

Linux-C成长之路(六):函数要义

Linux-C成长之路(七):数组与指针

Linux-C成长之路(八):存储类,动态内存

Linux-C成长之路(九):复合数据类型

Linux-C成长之路(十):其他高级议题

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c9b9ae4010789adbe288b961ca61bf5c.html