我在 C++ 中看到有多种分配和释放数据的方法,我知道当你调用 malloc
你应该调用 free
并且当你使用 new
运算符时您应该与 delete
配对,将两者混合是错误的(例如,在使用 new
运算符创建的东西上调用 free()
),但是我不清楚什么时候应该使用 malloc
/ free
以及什么时候应该使用 new
/ delete
真实世界的程序。
如果您是 C++ 专家,请告诉我您在这方面遵循的任何经验法则或约定。
原文由 Ralph Burgess 发布,翻译遵循 CC BY-SA 4.0 许可协议
我以前玩过一些用于计算机图形的 C/C++ 应用程序。过了这么久,有些东西消失了,我很想念它们。
关键是,malloc 和 new,或者 free 和 delete,可以同时工作,特别是对于某些最常见的基本类型。
例如,一个 char 数组,既可以使用 malloc 分配,也可以使用 new 分配。一个主要的区别是,使用 new 可以实例化一个固定的数组大小。
在这种情况下,您不能将变量用于数组的大小。相反,malloc 函数可以允许可变大小。
在这种情况下,可能需要转换转换运算符。对于从 malloc 返回的类型,它是指向 void 的指针,而不是 char。有时编译器不知道如何转换这种类型。
分配内存块后,可以设置变量值。对于一些更大的数组,memset 函数确实可能更慢。但是在分配值之前,必须首先将所有位设置为 0。因为数组的值可以具有任意内容。
假设,该数组被分配了另一个较小的数组。部分数组元素仍然可以有任意内容。在这种情况下,建议调用 memset 函数。
分配函数适用于所有 C 包。因此,这些是通用函数,必须适用于更多 C 类型。 C++ 库是旧 C 库的扩展。因此 malloc 函数返回一个通用的 void* 指针。这些结构没有定义 new 或 delete 运算符。在这种情况下,可以使用 malloc 分配自定义变量。
new 和 delete 关键字实际上是一些已定义的 C 运算符。也许自定义联合或类可以定义这些运算符。如果 new 和 delete 没有在类中定义,这些可能不起作用。但是如果一个类派生自另一个具有这些运算符的类,则 new 和 delete 关键字可以具有基本的类行为。
关于释放数组,free 只能与 malloc 配对使用。不能用 malloc 分配变量,然后用 delete 释放。
简单的删除运算符仅引用数组的第一项。因为 pWord 数组也可以写成:
当必须删除数组时,请改用 delete[] 运算符:
演员表还不错,它们只是不适用于所有变量类型。转换强制转换也是一个必须定义的运算符函数。如果没有为某种类型定义此运算符,它可能不起作用。但并不是所有的错误都是因为这个转换转换运算符。
使用免费调用时,还必须使用对 void 指针的强制转换。这是因为 free 函数的参数是一个 void 指针。
可能会出现一些错误,因为数组的大小太小。但这是另一个故事,不是因为使用演员阵容。
亲切的问候, 阿德里安·布里纳斯