文档详情

ZeroMemory、memset和“0”的区别

平***
实名认证
店铺
DOC
34.79KB
约3页
文档ID:11898870
ZeroMemory、memset和“0”的区别_第1页
1/3

ZeroMemory, 是 美 国 微 软 公 司 的 软 件 开 发 包 SDK 中 的 一 个 宏 其 作 用 , 是 用 0 来填 充 一 块 内 存 区 域 void ZeroMemory( PVOID Destination,SIZE_T Length );Destination :指 向 一 块 准 备 用 0 来 填 充 的 内 存 区 域 的 开 始 地 址 Length :准 备 用 0 来 填 充 的 内 存 区 域 的 大 小 , 按 字 节 来 计 算 ZeroMemory 只 是 将 指 定 的 内 存 块 清 零 使 用 结 构 前 清 零 , 而 不 让 结 构 的 成 员数 值 具 有 不 确 定 性 , 是 一 个 好 的 编 程 习 惯 为 了 避 免 优 化 编 译 器 的 意 外 的 影 响 , 请 使 用 SecureZeroMemory 函 数 这 个函 数 被 定 义 为 RtlZeroMemory 宏 更 新 信 息 , 请 查 看 Winbase.h 与Winnt.h 这 两 个 头 文 件 ZeroMemory 和 memset 的 区 别 :1、 ZeroMemory 是 微 软 的 SDK 提 供 的 , memset 是 属 于 C Run-time Library 提 供 的 。

因 此 ZeroMemory 只 能 用 于 Windows 系 统 , 而 memset 还可 用 于 其 他 系 统 2、 ZeroMemory 是 一 个 宏 , 只 是 用 于 把 一 段 内 存 的 内 容 置 零 , 内 部 其 实是 用 memset 实 现 的 , 而 memset 除 了 对 内 存 进 行 清 零 操 作 , 还 可 以 将 内 存置 成 别 的 字 符 3、 如 果 程 序 是 Win32 程 序 而 且 不 想 连 接 c 运 行 时 库 , 就 用ZeroMemory; 如 果 需 要 跨 平 台 , 就 用 memset 所 以 , 如 果 ZeroMemory 和 memset 用 于 清 零 操 作 , 其 本 质 是 一 样 的 ZeroMemory 和 “={0}”的 区 别 :1、 ZeroMemory 会 将 结 构 中 所 有 字 节 置 0, 而 “={0}”只 会 将 成 员 置0, 其 中 填 充 字 节 不 变 2、 一 个 struct 有 构 造 函 数 或 虚 函 数 时 , ZeroMemory 可 以 编 译 通 过 ,而 “={0}”会 产 生 编 译 错 误 。

其 中 , “={0}”的 编 译 错 误 起 到 了 一 定 的 保护 作 用 , 因 为 对 一 个 有 虚 函 数 的 对 象 使 用 ZeroMemory 时 , 会 将 其 虚 函 数 的指 针 置 0, 这 是 非 常 危 险 的 ( 调 用 虚 函 数 时 , 空 指 针 很 可 能 引 起 程 序 崩 溃 ) 示 例 代 码struct SPerson {char c;float s;};     class CTestVirtual {public: CTestVirtual(){} /// 虚 函 数 virtual int Draw() {return 10;} int a; }; int main(int argc, char* argv[]) { char sztmp[20]; /// 安 全 操 作 ZeroMemory(sztmp, sizeof(sztmp)); /// 安 全 操 作 SPerson sTest = {0}; int i = sizeof(SPerson); //// 会 引 起 编 译 错 误 ! //CTestVirtual otv = {0}; CTestVirtual tv; /// 危 险 操 作 ! ZeroMemory(&tv, sizeof(tv)); /// 因 为 对 象 没 有 使 用 虚 指 针 调 用 函 数 , 所 以 程 序 运 行 到 这 里 不 会 崩 溃 tv.Draw(); /// 将 对 象 地 址 赋 给 指 针 CTestVirtual *pTv = &tv; //虚 函 数 的 指 针 已 经 被 清 零 , 因 此 程 序 运 行 到 这 里 会 引 起 崩 溃 ! //错 误 信 息 : Unhandled exception at 0x004010b1 in Solution.exe: //0xC0000005: Access violation reading location 0x00000000. pTv->Draw(); return 0; } 因 此 , 在 windows 平 台 下 , 数 组 或 纯 结 构 使 用 ZeroMemory 是 安 全 的 ,而 类 (class)就 使 用 构 造 函 数 进 行 初 始 化 , 不 要 调 用 ZeroMemory。

另 外 , 如 果 一 个 类 的 结 构 中 包 含 STL 模 板 ( Vector、 List、 Map 等 等 ), 那 么 使 用 ZeroMemory 对 这 个 类 的 对 象 中 进 行 清 零 操 作 也 会 引 起 一 系 列 的崩 溃 问 题 ( 指 针 指 向 内 存 错 误 、 迭 代 器 越 界 访 问 等 ) 所 以 , 再 次 强 烈 建 议 :类 (class)只 使 用 构 造 函 数 进 行 初 始 化 , 不 要 调 用 ZeroMemory 进 行 清 零 操作 在 Windows 编 程 中 , ZeroMemory 的 作 用 是 用 0 来 填 充 一 块 内 存 区 域 ,主 要 是 你 填 充 一 些 数 据 结 构 时 把 它 们 填 为 0 比 较 保 险 , 因 为 很 多 默 认 的 参数 取 值 为 NULL, 操 作 系 统 会 替 你 解 决 。

下载提示
相似文档
正为您匹配相似的精品文档