c++ - 编译器控件如何帮助在 C++ 中分配和释放内存?

标签 c++ memory compiler-construction allocation

我在一本 C++ 书中读到,malloc()free() 是库函数,因此不在编译器的控制范围内。

但是,如果您有一个运算符执行动态存储分配和初始化的 union 操作(new),另一个运算符执行清理和释放存储的 union 操作(delete ),编译器仍然可以保证为所有对象调用构造函数和析构函数。

所以,我想知道编译器是如何执行的? 任何示例或演示都将被应用。

提前致谢。

最佳答案

malloc function 返回一 block 连续的内存,仅此而已。如何类型转换和使用它(用于您的对象)是您的问题。

虽然 new operator 返回内存中分配的对象。尽管两者都返回一个指针,但最终您得到的是构造的对象,而不是 C++ 中的原始内存。这里的重点从低级内存处理转移到类型安全的对象处理。这就是 new 不返回 void* 的原因。

此外,如果您注意到,在前一种情况下,C 是一个进行分配的函数,即语言本身没有分配对象或内存的概念。而在 C++ 中,new 是一个运算符,因此该语言天生就理解动态创建对象的含义。编译器执行语言要求的内容,因此能够在发现错误时标记错误。

一个例子是:

int *ptr = malloc(sizeof(char) * 4);

这里程序员假设一个整数的大小为 4,虽然这在他的平台上可能是正确的,但不一定适用于所有平台。同样在概念上 charint 是不同的类型,但是类型不匹配会被 C 编译器忽略。它所做的只是调用 malloc 函数并将它返回的地址分配给 ptr。它的域在那里结束,由程序员使用(或滥用?)分配的内存。这不是编译器的错误或弱点,因为语言标准没有赋予编译器更多的权力来执行更多。

在 C++ 中

int *ptr = new char[4];

会被标记为错误;正确的方法是 int *ptr = new int; 类型匹配的地方。 C++ 更严格,通过在错误常见的地方允许更少的自由,从而导致更清晰的代码。类型安全可以说是 C++ 语言最大的安全特性。出于同样的原因,类型转换具有丑陋的语法:它们显示了设计的弱点。使用更严格的语言,编译器能够对开发人员实现更多限制(因为人类更容易出错,这在大多数情况下都很有效)。

关于c++ - 编译器控件如何帮助在 C++ 中分配和释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21084939/

相关文章:

android - 相机通过 Intent 返回的位图大小?

compiler-construction - 着色器编译器如何工作?

c++ - 如何根据不寻常数字的数量对数组进行排序

c++ - 插装代码导致无限递归循环

android - 应用程序上下文变量的值因应用程序错误而丢失

c# - Double.MinValue、MaxValue 错误的编译时间常量 -- mscorlib

c - 编译器如何识别要读取或更新哪个静态变量?

c++ - 从 char* 创建 UTF-16 字符串

c++ - 如何读取数组的元素?

不使用 sprintf() 将 float 转换为字符串