面试准备每日五题:C++(五)——野指针、句柄&指针、new&delete&malloc&free、extern、类成员权限

1. 如何避免“野指针”

  • 指针变量声明时没有被初始化。解决办法:指针声明时初始化,可以是具体的地址值,也可让它指向NULL。
  • 指针p被free或者delete之后,没有置为NULL。解决办法:指针指向的内存空间被释放后指针应该指向NULL。
  • 指针操作超越了变量的作用范围。解决办法:在变量的作用域结束前释放掉变量的地址空间并且让指针指向NULL。

2. 句柄和指针的区别和联系是什么?

句 柄 和 指 针 其 实 是 两 个 截 然 不 同 的 概 念 。 W i n d o w s 系 统 用 句 柄 标 记 系 统 资 源 , 隐 藏 系 统 的 信 息 。 你 只 要 知 道 有 这 个 东 西 , 然 后 去 调 用 就 行 了 , 它 是 个 3 2 i t 的 u i n t 。 指 针 则 标 记 某 个 物 理 内 存 地 址 , 两 者 是 不 同 的 概 念 ;

3. new/delete与malloc/free的区别是什么

  • new能自动计算需要分配的内存空间,而malloc需要手工计算字节数
int *p = new int[2];
int *q = (int *)malloc(2*sizeof(int))
  • new与delete直接带具体类型的指针,malloc和free返回void类型的指针。
  • new类型是安全的,而malloc不是。例如int *p = new float[2];就会报错;而int p = m a l l o c ( 2 sizeof(int))编译时编译器就无法指出错误来。
  • new一般分为两步:new操作和构造。new操作对应与malloc,但new操作可以重载,可以自定义内存分配策略,不做内存分配,甚至分配到非内存设备上,而malloc不行。
  • new调用构造函数,malloc不能;delete调用析构函数,而free不能。
  • malloc/free需要库文件stdlib.h的支持,new/delete则不需要!

注 意 : d e l e t e 和 f r e e 被 调 用 后 , 内 存 不 会 立 即 回 收 , 指 针 也 不 会 指 向 空 , d e l e t e 或 f r e e 仅 仅 是 告 诉 操 作 系 统 , 这 一 块 内 存 被 释 放 了 , 可 以 用 作 其 他 用 途 。 但 是 由 于 没 有 重 新 对 这 块 内 存 进 行 写 操 作 , 所 以 内 存 中 的 变 量 数 值 并 没 有 发 生 变 化 , 出 现 野 指 针 的 情 况 。 因 此 , 释 放 完 内 存 后 , 应 该 讲 该 指 针 指 向 N U L L 。

4. 说一说extern“C”

e x t e r n " C " 的 主 要 作 用 就 是 为 了 能 够 正 确 实 现 C + + 代 码 调 用 其 他 C 语 言 代 码 。 加 上 e x t e r n " C " 后 , 会 指 示 编 译 器 这 部 分 代 码 按 C 语 言 ( 而 不 是 C + + ) 的 方 式 进 行 编 译 。 由 于 C + + 支 持 函 数 重 载 , 因 此 编 译 器 编 译 函 数 的 过 程 中 会 将 函 数 的 参 数 类 型 也 加 到 编 译 后 的 代 码 中 , 而 不 仅 仅 是 函 数 名 ; 而 C 语 言 并 不 支 持 函 数 重 载 , 因 此 编 译 C 语 言 代 码 的 函 数 时 不 会 带 上 函 数 的 参 数 类 型 , 一 般 只 包 括 函 数 名 。 这 个 功 能 十 分 有 用 处 , 因 为 在 C + + 出 现 以 前 , 很 多 代 码 都 是 C 语 言 写 的 , 而 且 很 底 层 的 库 也 是 C 语 言 写 的 , 为 了 更 好 的 支 持 原 来 的 C 代 码 和 已 经 写 好 的 C 语 言 库 , 需 要 在 C + + 中 尽 可 能 的 支 持 C , 而 e x t e r n " C " 就 是 其 中 的 一 个 策 略 ;

C++代码调用C语言代码
在C++的头文件中使用
在多个人协同开发时,可能有的人比较擅长C语言,而有的人擅长C++,这样的情况下也会有用到

5. C++中类成员的访问权限

C + + 通 过 p u b l i c 、 p r o t e c t e d 、 p r i v a t e 三 个 关 键 字 来 控 制 成 员 变 量 和 成 员 函 数 的 访 问 权 限 , 它 们 分 别 表 示 公 有 的 、 受 保 护 的 、 私 有 的 , 被 称 为 成 员 访 问 限 定 符 。 在 类 的 内 部 ( 定 义 类 的 代 码 内 部 ) , 无 论 成 员 被 声 明 为 p u b l i c 、 p r o t e c t e d 还 是 p r i v a t e , 都 是 可 以 互 相 访 问 的 , 没 有 访 问 权 限 的 限 制 。 在 类 的 外 部 ( 定 义 类 的 代 码 之 外 ) , 只 能 通 过 对 象 访 问 成 员 , 并 且 通 过 对 象 只 能 访 问 p u b l i c 属 性 的 成 员 , 不 能 访 问 p r i v a t e 、 p r o t e c t e d 属 性 的 成 员

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值