新建/删除/免费存储和 malloc/免费/堆组合
new/delete/free store and malloc/free/heap combinations
new/delete
关键字使用免费商店
malloc/free
关键字都使用堆
我看到某处写着new
使用malloc
. 怎么可能? 它们不在内存段中使用?
其次,我看到某处写着我们不能在new
后使用free
或在malloc
后使用delete
.但是如果new
使用malloc
为什么free
不起作用?
以及我们在 new
ect 之后使用free
的地方'。 这是错误或未定义的行为?
谢谢
new
/delete
关键字使用免费商店
malloc
/free
关键字使用堆
我看到写在某处,new
使用malloc
.怎么可能?它们不在内存段中使用?
C++中的"免费存储"是一个术语,用于描述动态存储持续时间的对象所在的位置。术语"堆"是同一事物的口语。 new
可能会使用malloc
,这很好。
但是,它也执行其他操作,例如调用构造函数,并且可能而不是使用其他内存管理系统(例如内存池)malloc
。
是的,未定义free
您分配的对象 new
,主要是因为free
不调用类析构函数。同样,对于delete
你用malloc
创建的东西:这样做就是混合两种不同的分配/构造习语,虽然你可以让它工作,但要做到这一点是非常困难的。
为什么这个内存段有两个名字?
因为"堆"(甚至不是"内存段")可能不是堆,所以这是一个愚蠢的术语。C++试图通过引入抽象的"免费商店"来逐步淘汰它。不幸的是,人们一直说"堆",因为(a)遗产,(b)复制猫自行车棚,(c)对抽象的目的/意义/价值的无知,以及(d)教育/指导不佳。
关于你的第一个问题:免费存储和堆是同义词。 例如,请参阅:http://en.wikipedia.org/wiki/Heap_%28programming%29。 所以那里没有矛盾。
至于为什么不混新删,这个答案:https://stackoverflow.com/a/3184129/2050788 给出了一个很好的总结。 为方便起见,复制粘贴:
如果这样做,则会遇到未定义的行为。永远不要尝试。虽然 new 可以通过 malloc() 实现,而 delete 可以通过 free() 实现,但不能保证它们真的以这种方式实现,而且用户可以自行决定重载 new 和删除。您可能会遇到堆损坏。除此之外,不要忘记,当你调用malloc()时,你会得到原始内存 - 没有调用构造函数 - 当你调用free()时,不会调用析构函数。这也可能导致程序的未定义行为和运行不当。底线是...永远不要这样做。
简而言之:永远不要将这些内存管理方法组合在一起。也就是说,切勿在通过new
分配的内存上使用free
,反之亦然。
现在,一些C++标准库实现实际上确实使用 malloc
实现了operator new
,因此在某些情况下它可能在某些平台上工作,但您不能依赖它,因为既不保证也不要求实现这样做。
此外,free
不会调用析构函数,然后,C++类可能会提供专门的内存管理,如果将其与malloc
/free
混合使用,肯定会中断。
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 可组合的lambda/std::函数与std::可选
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 混合组合和继承的C++问题
- 我需要将多个函数组合为一个函数
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 通过组合不同的类型来创建唯一的id
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 模板元编程:如何将参数包组合成新的参数包
- 检查向量是否具有所有可能的字符组合
- 如何在加密++中将两个源组合成新的源
- 根中的组合
- 更改 C++ 中的组合分类变量
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 组合字符串不适用于 libCurl,C++
- 如何在cpp中删除(免费)多维结构内存?
- 测试两个类型列表中的所有组合
- 将多个 for 循环组合成单个迭代器
- 如何从组合指数中找到仓位
- 新建/删除/免费存储和 malloc/免费/堆组合