gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:49 24 4
gpt4 key购买 nike

我在一本 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com