面试总结(malloc、虚继承、assert)
来源:互联网 发布:php初级程序员面试题 编辑:程序博客网 时间:2024/06/16 18:24
1.
void *malloc(int size);
首先介绍一下内存分配
<1>从静态存储区域分配.
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量.
<2>在栈上分配
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.
<3>从堆上分配,亦称动态内存分配.
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的生存期由用户决定,使用非常灵活,但问题也最多.
C语言跟内存申请相关的函数主要有 alloca、calloc、malloc、free、realloc等.
<1>alloca是向栈申请内存,因此无需释放.
<2>malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间.
<3>calloc则将初始化这部分的内存,设置为0.
<4>realloc则对malloc申请的内存进行大小的调整.
<5>申请的内存最终需要通过函数free来释放.
void* malloc(unsigned size);
void* realloc(void* ptr, unsignednewsize);
void*calloc(size_t numElements, size_t sizeOfElement);
2.虚继承
假设derived 继承自base类,那么derived与base是一种“isa”的关系,即derived类是base类,而反之错误;
假设derived 虚继承自base类,那么derivd与base是一种“hasa”的关系,即derived类有一个指向base类的vptr。
因此虚继承可以认为不是一种继承关系,而可以认为是一种组合的关系。正是因为这样的区别,下面我们针对虚拟继承来具体分析。虚拟继承中遇到最广泛的是菱形结构。
本来虚拟继承的目的就是当多重继承出现重复的基类时,其只保存一份基类。减少内存开销。
使用虚继承时,不能将基类通过static_cast转换为继承类。我们知道c++提供的强制转换函数static_cast对于继承体系中的类对象的转换一般是可行的。那么这里为什么就不可以了呢?还是需要从虚拟继承的内部实现来说明问题。
virtualbase class的原始模型是在class object中为每一个有关联的virtual base class加上一个指针vptr,该指针指向virtual基类表。有的编译器是在继承类已存在的virtual table直接扩充导入一个virtual base class table。不管怎么样由于虚继承已完全破坏了继承体系,不能按照平常的继承体系来进行类型转换。
3.assert
#include <assert.h>void assert( int expression );
assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用
- 面试总结(malloc、虚继承、assert)
- malloc assert!
- assert()函数用法总结
- assert()函数用法总结
- assert()总结
- Java面试宝典-assert
- (转)assert()函数用法总结
- assert()函数的用法总结
- Valgrind解决 malloc assert failed 3096
- 虚继承总结(重点:虚继承与虚函数)
- 18、malloc函数用法(完善总结)
- assert用法总结
- JUnit Assert方法总结
- JUnit Assert方法总结
- assert用法总结
- assert用法总结
- assert用法总结
- assert用法总结
- 计算机网络Socket编程之TCP协议
- case class 跟普通class有什么区别
- 【数据结构】单链表
- spring如何集成一主多从的redis
- Python 爬虫3——第一个爬虫脚本的创建
- 面试总结(malloc、虚继承、assert)
- 怎么用gnuplot画动图
- Oracle pl/sql 出现"PLS-00103: 出现符号""在需要下列之一时" 错误
- Android SQLite的介绍
- 按钮翻转并控制视图的翻转(带动画)Demo
- 封装控件,需要重写的方法
- 计算思维实践之路(四)
- 关于元素层叠顺序的探讨
- 面试题58:二叉树的下一个节点