面试总结(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调用

0 0