new和malloc

        在C++和C语言编程中,动态内存分配是一个核心概念,它允许程序在运行时根据需要分配或释放内存。New(在C++中)和  Malloc(在C中)是两种常用的动态内存分配方法。

        

newmalloc的基本原理

        在C++中,new操作符用于动态地分配内存。它不仅分配所需的内存量,还调用对象的构造函数(对于非内置类型)。类似地,在C语言中,malloc函数用于在堆上分配指定字节数的内存。这两者都不会初始化所分配的内存(除了new可能会调用对象的构造函数进行初始化)。

// C++中使用new分配内存int* ptr1 = new int;MyClass* objPtr = new MyClass(); // 调用MyClass的构造函数// C语言中使用malloc分配内存int* ptr2 = (int*) malloc(sizeof(int));

堆内存的连续性

        当我们谈论堆内存的连续性时,我们通常是指逻辑上的连续性,而不是物理内存地址的绝对连续性。在大多数情况下,newmalloc分配的内存块在逻辑上是连续的,即它们提供了一个可以顺序访问的地址空间。然而,这并不意味着这些内存在物理内存中是紧邻的;现代操作系统和内存管理系统使用虚拟内存技术,使得逻辑上连续的内存地址在物理内存中可能并不连续。

堆内存分配的行为

  newmalloc都向堆管理器请求内存。堆管理器负责找到足够大的连续内存块来满足请求。这个连续的内存块在逻辑上是连续的,允许我们按照顺序存储和访问数据。但是,每次调用newmalloc时,返回的内存地址可能会与之前的调用完全不同,因为它们是从堆中的不同部分分配的。

int* ptr3 = new int; // 这块内存与ptr1指向的内存不一定是物理上连续的

内存碎片与连续性

        频繁地分配和释放不同大小的内存块可能导致内存碎片。内存碎片是指堆中无法被有效利用的小块内存。这可能会影响newmalloc分配连续内存块的能力,因为大块连续的内存可能由于碎片而不可用。

堆内存的分配策略

        不同的系统和编译器实现可能会使用不同的堆内存分配策略。例如,一些系统可能会使用分离适配(Segregated Fit)策略,将内存分成不同大小类别的空闲链表,以便更快地满足内存请求。其他系统可能会使用伙伴系统(Buddy System)或斯利宾斯基-弗兰科西斯(Sliabne-Frasier)算法等。这些策略都旨在高效地管理堆内存,但可能会影响内存的连续性。

代码示例与解析

        下面的代码示例演示了如何在C++中使用new和在C中使用malloc来分配内存,并展示了这些内存块在逻辑上是如何连续的,但在物理内存中可能不是。

#include <iostream>#include <cstdlib> // for malloc and free in C++int main() {    // C++中使用new分配内存    int* array1 = new int[10]; // 分配一个包含10个整数的数组    for (int i = 0; i < 10; ++i) {        array1[i] = i; // 可以顺序访问,逻辑上是连续的    }    // C语言中使用malloc分配内存(在C++中需要包含cstdlib头文件)    int* array2 = (int*) malloc(10 * sizeof(int)); // 分配10个整数的空间    for (int i = 0; i < 10; ++i) {        array2[i] = i * 2; // 同样可以顺序访问,逻辑连续    }    // 打印并验证内存的逻辑连续性    for (int i = 0; i < 10; ++i) {        std::cout << "array1[" << i << "] = " << array1[i] << std::endl;        std::cout << "array2[" << i << "] = " << array2[i] << std::endl;    }    // 释放内存    delete[] array1; // C++中使用delete[]释放动态数组    free(array2); // C语言中使用free释放内存    return 0;}

        在这个例子中,array1array2都是通过动态内存分配得到的,并且它们在逻辑上是连续的,可以通过索引顺序访问。然而,这并不意味着array1array2在物理内存中是紧邻的;它们可能位于完全不同的内存页上。

结论

  newmalloc分配的堆内存在逻辑上是连续的,允许程序按照顺序进行访问。然而,由于现代操作系统的内存管理机制,这些内存在物理上可能不是连续的。程序员通常不需要关心物理内存的连续性,因为虚拟内存系统提供了逻辑上连续的内存视图,足以满足大多数编程需求。

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值