VirtualAlloc 和 HeapAlloc 有什么区别?

2023-12-02

Windows环境下分配内存的方法有很多,例如VirtualAlloc, HeapAlloc, malloc, new.

那么,它们之间有什么区别呢?


每个 API 都有不同的用途。每一种方法还要求您在使用完内存后使用正确的释放/释放函数。

虚拟分配

一个低级的 Windows API,提供了很多选项,但主要对处于相当特定情况的人有用。只能以更大的块(编辑:不是 4KB)分配内存。在某些情况下您需要它,但当您处于其中一种情况时您就会知道。最常见的情况之一是您必须直接与另一个进程共享内存。不要将其用于通用内存分配。使用VirtualFree解除分配。

堆分配

分配您要求的任何大小的内存,而不是大块VirtualAlloc. HeapAlloc知道什么时候需要调用VirtualAlloc并自动为您执行此操作。喜欢malloc,但仅适用于 Windows,并提供了更多选项。适合分配一般内存块。某些 Windows API 可能要求您使用它来分配传递给它们的内存,或者使用它的同伴HeapFree释放他们返回给你的记忆。

malloc

C 分配内存的方式。如果您使用 C 而不是 C++ 编写,并且希望您的代码能够在例如Unix计算机也一样,或者有人专门说你需要使用它。不初始化内存。适合分配一般内存块,例如HeapAlloc。一个简单的 API。使用free解除分配。 Visual C++ 的malloc calls HeapAlloc.

new

C++ 分配内存的方式。如果您使用 C++ 编写,则更喜欢这个。它还将一个或多个对象放入分配的内存中。使用delete解除分配(或delete[]对于数组)。视觉工作室的new calls HeapAlloc,然后可能会初始化对象,具体取决于您如何调用它。

在最近的 C++ 标准(C++11 及更高版本)中,如果您必须手动使用delete,你做错了,应该使用智能指针 like unique_ptr反而。从 C++14 开始,同样可以这样说new(替换为诸如make_unique()).


还有一些其他类似的功能,例如SysAllocString您可能会被告知必须在特定情况下使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VirtualAlloc 和 HeapAlloc 有什么区别? 的相关文章

随机推荐

  • 如何在 JPA 中表达多态关联?

    A 多态关联类似于外键或多对一关系 不同之处在于目标可能是多种类型之一 语言中的类 数据库中的表 我正在将我使用多年的数据库设计从 PHP 移植到 Java 在旧代码中 我推出了自己的 ORM 但由于多种原因 它并不是最佳的 尽管我可能稍后
  • Google 地图容器显示没有地图

    我知道这个问题之前已经被问过很多次了 但是我见过的其他答案似乎都没有帮助我 基本上 地图的容器显示 作为页面上 500x300px 的空白 但没有地图 无论我做什么 我都无法显示地图 正如您可能猜到的那样 我不熟悉 Google 地图 因此
  • 将自动完成列表中的国家/地区的 Google 地图限制为“印度、美国和英国”

    该代码不起作用 请告诉我具体的解决方案 javascript gt
  • 为什么 readfile() 在读取 php 文件时表现得很奇怪,但在文本文件上却工作得很好

    代码在index php hello php 中的代码 我得到的输出是47但是当我在 hello php 中的字符串之前添加一行时 即echo br hello this is a php file 我得到输出hello this is a
  • 使用 python 3 专门化 JSON 对象编码

    由于Python3中dict values 和keys 的更改 我遇到了一些麻烦 我的旧代码是这样的 import json class ComplexEncoder json JSONEncoder def default self ob
  • 生成重复序列

    我需要使用 R 生成以下格式的向量 1 10 1 10 11 20 11 20 121 130 121 130 有没有比创建 12 个向量然后将每个向量重复两次更简单的方法 你也可以这样做 rep 1 10 26 rep seq 0 120
  • 避免多次快速点击按钮

    我的应用程序有一个问题 如果用户快速单击按钮多次 那么在按住按钮的对话框消失之前就会生成多个事件 我知道一个解决方案 通过在单击按钮时将布尔变量设置为标志 以便可以防止将来的单击 直到对话框关闭 然而 我有很多按钮 每次都必须为每个按钮执行
  • 在 mongodb 集合中查找一些值?

    我正在尝试使用 java 读取 mongodb 用户数据库 在教程页面上我看到了如何阅读整个集合 我可以做这样的事情 DBCursor cursor col find while cursor hasNext System out prin
  • 创建表,检查可能的文本值

    我正在使用 MS Access 2010 并尝试使用 SQL 创建表 我想加入一些检查约束 但我遇到了一些麻烦 CREATE TABLE Test tester Text CHECK tester IN ABC BCD CDE 我遇到语法错
  • `use` 包作用域:如何使其跨文件?

    In scriptA pl 有use DBI In scriptB pl 有require scriptA pl 但我们仍然不能使用DBI包scriptB pl 除了重复之外有任何方法可以处理这个问题use DBI in scriptB p
  • 在 PIL 中制作拼贴画

    我是 卡住 我已经为此工作了一个多星期了 但我似乎无法让我的代码正确运行 我对 PIL 和 Python 整体来说还很陌生 我正在尝试制作一些图片的 2x3 拼贴画 下面列出了我的代码 我试图让我的照片适合新创建的拼贴画中的任何访问黑色空间
  • 如何在 python 3.6 而不是默认的 python 2.7 上安装 pip?

    所以一整天我都在尝试安装pip 我已经执行了curl https bootstrap pypa io get pip py gt get pip py Then sudo python get pip py 接下来我去安装 numpysud
  • 嵌套片段可能吗?

    我有一个 ViewPager 包含三个片段 我想将 3 个新片段放入第三个片段中 这可能吗 ViewPager Fragment 1 Fragment 2 Fragment 3 Fragment 3 1 Fragment 3 2 Fragm
  • 物体(汽车)检测与分割

    I am trying to segment cars from image that consist of only one car and an easy background like but what I get from my i
  • Dictionary.ContainsKey() 未按预期工作

    我有一本字典 Dictionary
  • vim,在html中缩进css和js的正确方法

    老问题找不到正确的解决方案 所以
  • 按report_id获取前'n'条记录

    我的 MSSQL 数据库中有一个简单的视图 它由以下字段组成 report id INT ym VARCHAR YYYY MM keyword VARCHAR MAX visits INT 我可以通过以下查询轻松获得排名前 10 的关键字命
  • 使用鼠标滚轮缩放条形图

    我发现了许多如何放大图表的示例 但我正在寻找用户可以使用鼠标滚轮滚动的基本示例 import javafx application Application import javafx scene Scene import javafx sc
  • 我无法使用 YouTube Data API v3 获取频道 ID

    我试图通过用户名获取 YouTube 频道 ID 但最终我什么也没得到 用户名和 API 密钥正确 可能是什么问题呢 HTTP 请求 https www googleapis com youtube v3 channels part id
  • VirtualAlloc 和 HeapAlloc 有什么区别?

    Windows环境下分配内存的方法有很多 例如VirtualAlloc HeapAlloc malloc new 那么 它们之间有什么区别呢 每个 API 都有不同的用途 每一种方法还要求您在使用完内存后使用正确的释放 释放函数 虚拟分配