C++面试题-指针-动态内存指针

问:什么是内存泄漏和内存溢出?

答:内存泄漏:在程序申请内存后,该内存不再会被引用,但是不能释放该内存空间。如果你delete指针之后,该空间不能归还,自己又不能进行访问(找不到该内存的地址)。

内存溢出:系统预定好的内存空间不满足程序在请求的内存大小,不够用,就是内存越界。(比如一个由系统分配固定大小的数组存放大于该数组的一组数据,便是溢出)主要的情况就是栈溢出,栈内存不足。还有一种情况是缓冲区溢出。

内存上溢:栈满时,再进行入栈运算。

内存下溢:空栈(栈里面没有数据),再进行出栈运算

问:malloc函数前面为什么一定要强制转换成相应的类型?

答:因为malloc的返回值是void*类型的,表明还不清楚指向的指针类型是什么。在堆上申请好内存之后,在运用过程中,只需要强制转换自己想要的指针类型就可以了。函数原型:void *malloc(size_t)。

问:利用malloc函数申请内存块。如果内存不足,就发生什么情况?

答:如果内存不足,malloc就会返回NULL。

问:malloc的参数是“0”或者“NULL”或者“负数”,会有什么意义?

答:

参数为0时,可能返回NULL,也可能返回一个指向分配了0字节区域的指针。

参数为NULL时,生成一个警告然后返回0字节。

参数为负数时,会引发一些问题。

问:请分析delete 指针 delete[] 指针的区别?

答:比如:

Button *btn = new Button();

就用 delete btn;

int *arr = new int[100];

就用 delete [] arr;

问:下面代码输出结果是?

void array(int *arr, int size, int value)

{

if (arr != NULL)

{

for (int i = 0; i < size; i++)

{

arr[i] = value;

value++;

}

}

}

int main()

{

int *vector = (int*)malloc(5*sizeof(int));

array(vector,5,1);

for (int i = 0; i < 5; i++)

{

cout << *(vector + i) << endl;

}

return 0;

}

答:1   2   3    4     5

问:newdeletemallocfree关系?

答:delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

问:deletedelete[]的区别是什么?

答:delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”delete与new配套,delete []与new []配套。

MemTest *mTest1=new MemTest[10];

MemTest *mTest2=new MemTest;

Int *pInt1=new int [10];

Int *pInt2=new int;

delete[]pInt1; //-1-

delete[]pInt2; //-2-

delete[]mTest1;//-3-

delete[]mTest2;//-4-

在-4-处报错。

这就说明:对于内建简单数据类型,delete和delete[]功能是相同的。对于自定义的复杂数据类型,delete和delete[]不能互用。delete[]删除一个数组,delete删除一个指针。简单来说,用new分配的内存用delete删除;用new[]分配的内存用delete[]删除。delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。

问:如果创建对象是数组类型,例如CBook *pBooks=new CBook[5];.那么释放对象时,只用delete,会不会发生内存泄漏?

答:不一定会发生,但是这是不好的编码习惯。如果类的数据成员没有在堆区,不会发生内存泄漏。但是如果类的数据成员在堆区,是发生内存泄漏的。

C++面试题-指针-动态内存指针相关推荐

  1. C语言_指针动态内存分布

    传 统 数 组 的 缺 点 . 1. 数 组 长 度 必 须 事 先 制 定 , 且 只 能 是 常 整 数 , 不 能 是 变 量 例 子 : int a[5] ;/ / 0K int len = ...

  2. 指针数组,数组指针,指针函数,函数指针,二级指针详解

    先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[ ...

  3. RT-Thread 动态内存管理(学习笔记)

    本文参考自[野火EmbedFire]<RT-Thread内核实现与应用开发实战--基于STM32>,仅作为个人学习笔记.更详细的内容和步骤请查看原文(可到野火资料下载中心下载) 文章目录 ...

  4. 动态内存管理和智能指针 2.0 -- shared_ptr

    shared_ptr出现原因 通过第一章的学习,我们知道不管是auto_ptr合适scoped_ptr都是存在缺陷的,于是我们必须想出一个方法既能很好的管理我们的内存,而且在使用的时候,可以多个指针指 ...

  5. 学了指针没学动态内存一切都白搭!C语言基础教程之内存管理

    本文将讲解 C 中的动态内存管理.C 语言为内存的分配和管理提供了几个函数.这些函数可以在<stdlib.h>头文件中找到. 在内存中动态地分配 num 个长度为 size 的连续空间,并 ...

  6. C++知识点34——动态内存与智能指针

    一.动态内存 动态内存所在的位置在堆区,由程序员手动分配并手动释放,而不像栈内存由系统分配和自动释放 C++通过new运算符为对象在堆上分配内存空间并返回该对象的地址,并用delete运算符销毁对象并 ...

  7. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  8. 26.智能指针和动态内存

    在C++中,动态内存的管理是通过一对运算符来完成的.new在动态内存中为对象分配空间并返回一个指向该内存对象的指针. delete,接受一个动态对象的指针,销毁该对象,并释放与之关联的内存! 为什么要 ...

  9. C++ Primer 5th笔记(chap 12 动态内存)智能指针概述

    1. 对象的生存期 内存类型 定义 分配和销毁时机 全局对象 程序启动时分配,程序结束时销毁 静态内存 局部static对象类static数据成员 第一次使用时分配,程序结束时销毁 栈内存 定义在函数 ...

最新文章

  1. mysql单用户赋予多库权限
  2. Redis 配置连接池,redisTemplate 操作多个db数据库,切换多个db,解决JedisConnectionFactory的设置连接方法过时问题。(转)
  3. 解决小米手机无法收到开机广播的问题
  4. 神经网络预测mnist时候如果不归一化,则准确率仅仅10%下文作者svm也遇到了。
  5. C++ cin不支持录入空格
  6. Go语言可能会遇到的坑
  7. Spring MVC -- 国际化
  8. 歪歪协议服务器,YY 2015 逆向分析-底层通讯机制
  9. 包管理工具conda极简教程
  10. 北京理工大学珠海学院专业计算机类,北京理工大学珠海学院计算机学院网络工程专业...
  11. 农村新农保加钱可不可以转城市社保?
  12. JAVA 序列化 Jackson_SpringBoot系列——Jackson序列化
  13. stm32程序跑飞_mm32芯片使用心得(三)音频播放程序修改
  14. 鸿蒙系统官网电脑版,华为鸿蒙系统官方pc版下载-华为鸿蒙系统官方电脑pc版 -优盘手机站...
  15. (图文详细)设置文件夹中的文件显示文件后缀名的方法
  16. ThinkPad蓝牙鼠标出现延迟、断开连接等问题的解决办法
  17. linux驱动面试题目汇总
  18. OCP最新题库收集,052新加的考题及答案整理-19
  19. MySQL学习(十六):数据类型之日期与时间类型
  20. 苹果太狠了:升级iOS 8小心变砖

热门文章

  1. C++ 抛出和接收异常的顺序
  2. ccf——201903-4 消息传递接口
  3. jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算
  4. ssh(安全协议外壳)
  5. 【总结】最短路径条数问题
  6. 值得收藏的前端大牛博客
  7. extjs中grid中行内文本或图片居中显示
  8. Raid Level,该如何为Oracle存储选择才好?
  9. 云计算和主机托管有哪几点不同?
  10. tomocat设置首次访问时的页面