2014 年百度校园招聘南京站 PC 客户端开发笔试题
一 、 问 答 题 : 50 分
1、 写 出 new 和 malloc、 delete 和 free 的 区 别
从 面 向 对 象 来 说 ,new/delete 和 malloc/free 的 区 别 是 :malloc/free 只 是
单 纯 的 进 行 内 存 空 间 的 分 配 和 释 放 , 而 使 用 new/delete 时 , 不 仅 分 配 了 内 存 空
间 ,若 new/delete 的 是 一 个 类 ,还 会 调 用 类 (经 测 试 ,基 本 类 型 好 像 不 会 进 行 默
认 初 始 化 )的 构 造 函 数 或 析 构 函 数 。
简 单 来 说 , 两 者 的 区 别 主 要 有 :
1. malloc 与 free 是 C++/C 语 言 的 标 准 库 函 数 , new/delete 是 C++的 运 算
符 , 与 ” +“ 、 ” -“ 、 ” *“ 、 ” /“ 有 一 样 的 地 位 。
2. new/delete 是 可 以 重 载 的 , 而 重 载 之 后 , 就 成 为 了 函 数 。
3. malloc 在 申 请 内 存 的 时 候 , 必 须 要 提 供 申 请 的 长 度 , 而 且 返 回 的 指 针 是
void*型 , 必 须 要 强 转 成 需 要 的 类 型 。
4. 当 new/delete 在 类 中 被 重 载 的 时 候 ,可 以 自 定 义 申 请 过 程 ,比 如 记 录 所
申 请 内 存 的 总 长 度 , 以 及 跟 踪 每 个 对 象 的 指 针 。
5. new/delete, 其 实 内 部 也 调 用 了 malloc/free。
两 者 的 共 同 点 有 :
1. 都 必 须 配 对 使 用 , 防 止 内 存 泄 露 。
2. 都 可 用 于 申 请 动 态 内 存 和 释 放 内 存 , 都 是 在 堆 中 分 配 内 存 。
3. free 和 delete 可 以 释 放 NULL 指 针 。
2、 写 两 个 继 承 类 , 解 释 虚 表 指 针 和 虚 表 的 作 用
每 一 个 类 都 有 虚 表 。
虚 表 可 以 继 承 ,如 果 子 类 没 有 重 写 虚 函 数 ,那 么 子 类 虚 表 中 仍 然 会 有 该 函 数
的 地 址 , 只 不 过 这 个 地 址 指 向 的 是 基 类 的 虚 函 数 实 现 。 如 果 基 类 有 3 个 虚 函 数 ,
那 么 基 类 的 虚 表 中 就 有 三 项 (虚 函 数 地 址 ),派 生 类 也 会 有 虚 表 ,至 少 有 三 项 ,如
果 重 写 了 相 应 的 虚 函 数 , 那 么 虚 表 中 的 地 址 就 会 改 变 , 指 向 自 身 的 虚 函 数 实 现 。
如 果 派 生 类 有 自 己 的 虚 函 数 , 那 么 虚 表 中 就 会 添 加 该 项 。
派 生 类 的 虚 表 中 虚 函 数 地 址 的 排 列 顺 序 和 基 类 的 虚 表 中 虚 函 数 地 址 排 列 顺
序 相 同 。
3、 写 出 static 的 用 法 和 作 用
static 是 C++中 很 常 用 的 修 饰 符 ,它 被 用 来 控 制 变 量 的 存 储 方 式 和 可 见 性 。
函 数 内 部 定 义 的 变 量 , 在 程 序 执 行 到 它 的 定 义 处 时 , 编 译 器 为 它 在
栈 上 分 配 空 间 ,大 家 知 道 ,函 数 在 栈 上 分 配 的 空 间 在 此 函 数 执 行 结 束 时 会 释
放 掉 , 这 样 就 产 生 了 一 个 问 题 : 如 果 想 将 函 数 中 此 变 量 的 值 保 存 至
下 一 次 调 用 时 ,如 何 实 现 ? 最 容 易 想 到 的 方 法 是 定 义 一 个 全 局 的 变 量 ,但 定
义 为 一 个 全 局 变 量 有 许 多 缺 点 , 最 明 显 的 缺 点 是 破 坏 了 此 变 量 的
访 问 范 围 (使 得 在 此 函 数 中 定 义 的 变 量 , 不 仅 仅 受 此 函 数 控 制 )。 需 要 一 个
数 据 对 象 为 整 个 类 而 非 某 个 对 象 服 务 ,同 时 又 力 求 不 破 坏 类 的 封 装
性 ,即 要 求 此 成 员 隐 藏 在 类 的 内 部 , 对 外 不 可 见 。
4、 写 出 计 算 机 的 存 储 器 层 次 , 及 原 因
以 处 理 器 为 中 心 , 计 算 机 系 统 的 存 储 依 次 为 寄 存 器 、 高 速 缓 存 、 主 存 储 器 、
磁 盘 缓 存 、磁 盘 和 可 移 动 存 储 介 质 等 7 个 层 次 。距 离 处 理 器 越 近 的 存 储 工 作 速 度
越 高 ,容 量 越 小 。其 中 ,寄 存 器 、高 速 缓 存 、主 存 储 器 为 操 作 系 统 存 储 管 理 的 管
辖 范 围 , 磁 盘 和 可 移 动 存 储 介 质 属 于 操 作 系 统 设 备 管 理 的 管 辖 范 围 。
5、 写 出 对 windows 中 的 句 柄 的 理 解
所 谓 句 柄 实 际 上 是 一 个 数 据 , 是 一 个 Long (整 长 型 )的 数 据 。
句 柄 是 WONDOWS 用 来 标 识 被 应 用 程 序 所 建 立 或 使 用 的 对 象 的 唯 一 整 数 ,
WINDOWS 使 用 各 种 各 样 的 句 柄 标 识 诸 如 应 用 程 序 实 例 , 窗 口 , 控 制 , 位 图 , GDI
对 象 等 等 。 WINDOWS 句 柄 有 点 象 C 语 言 中 的 文 件 句 柄 。
二 、 算 法 题 : 30 分
1、 计 算 字 符 串 的 相 似 度 -《 编 程 之 美 》 3.3
int calStringDis(string strA, int pABegin,int pAEnd,string strB, int
pBBegin,int pBEnd)
{
if (pABegin > pAEnd)
{
if (pBBegin > pBEnd)
return 0;
else
return pBEnd – pBBegin + 1;
}
if (pBBegin > pBEnd)
{
if(pABegin > pAEnd)
return 0;
else
return pAEnd – pABegin + 1;
}
if (strA[pABegin] == strB[pBBegin])
{
return calStringDis(strA,pABegin+1,pAEnd,strB,pBBegin+1,pBEnd);
}
else
{
int t1 = calStringDis(strA,pABegin+1,pAEnd,strB,pBBegin+2,pBEnd);
int t2 = calStringDis(strA,pABegin+2,pAEnd,strB,pBBegin+1,pBEnd);
int t3 = calStringDis(strA,pABegin+2,pAEnd,strB,pBBegin+2,pBEnd);
return minValue(t1,t2,t3)+1;
}
}
2、 判 断 链 表 是 否 存 在 闭 环
//using step1 and step2 here
//if exists a loop, then the pointer which use step2 will catch up
with the pointer which uses step1
int HasLoop(LinkList L)
{
int step1 = 1;
int step2 = 2;
LinkList p = L;
LinkList q = L;
//while (p != NULL && q != NULL && q->next == NULL)
while (p != NULL && q != NULL && q->next != NULL)
{
p = p->next;
if (q->next != NULL)
q = q->next->next;
printf("p:%d, q:%d \n", p->data, q->data);
if (p == q)
return 1;
}
return 0;
}
三 、 系 统 设 计 题 : 选 做 一 题 20 分
1、 连 连 看 游 戏 中 , 写 出 两 种 算 法 的 大 致 原 理 , 来 判 断 两 个 图 案 是 否 能 够 连
线 。 并 详 细 解 释 , 写 出 其 中 一 个 算 法 的 伪 代 码 。
2、 解 释 延 迟 过 程 调 用 deferred procedure call (DPC)和 异 步 过 程 调 用
asynchronous procdure call (APC)的 工 作 机 制 。 详 细 描 述 利 用 APC 实 现 DLL
注 入 。