內存申请是否可行判断

文章讲述了C/C++中内存分配函数malloc、calloc、realloc和new的使用,以及它们在内存失败时的返回值和处理方式。特别强调了32位系统中数组大小的限制,以及如何在C++中通过new抛出的bad_alloc异常进行异常处理。同时提到了在64位系统中的内存扩展可能性和实际限制。
摘要由CSDN通过智能技术生成

C语言中

因为malloccallocrealloc申请內存失败返回的都是NULL或者nullptr

如果 malloc 返回 NULL 或者nullptr,可以将其视为内存分配失败,并采取相应的错误处理措施。例如,可以打印错误消息并终止程序的执行,或者进行其他适当的错误处理操作。

#include <stdio.h>
#include <stdlib.h>

int main() 
{
    int* ptr = malloc(100 * sizeof(int));
    if (ptr == NULL) {
        printf("内存分配失败\n");
        // 执行错误处理逻辑,如终止程序
        exit(1);
    }

    // 内存分配成功,继续执行其他操作

    free(ptr); // 释放内存

    return 0;
}

C++中

当使用 new 运算符在 C++ 中申请内存时,如果申请失败,会抛出 std::bad_alloc 异常。 std::bad_alloc 是 C++ 标准库中的异常类,用于表示内存分配失败的情况。 当 new 无法分配所需的内存时,它会抛出 std::bad_alloc 异常,你可以使用异常处理机制来捕获并处理该异常。以下是一个示例:

#include <iostream>
using namespace std;
int main() 
{
    try 
    {
        // 申请一个巨大的数组
        // 使用 ptr 指向的内存块
        int* ptr = new int[0x7ffffffe];
        delete[] ptr;
    } 
    catch (bad_alloc& e) 
    {
        cout << "内存分配失败:" << e.what() << endl;
    }
    return 0;
}

bad_alloc 是一个异常类,它是C++标准库中的一个异常类,用于表示内存分配失败的异常情况。

& e 是一个异常对象的引用,用于捕获抛出的异常对象。

在这种情况下, e 是一个引用,用于引用被抛出的 bad_alloc 异常对象。 在 try 块中,如果发生了 bad_alloc 异常,程序会跳转到 catch 块中,并执行相应的异常处理代码。在这个例子中,当 bad_alloc 异常被捕获时,会输出异常的具体信息( e.what() )来指示内存分配失败的原因。 这种异常处理机制可以帮助我们在程序运行时处理异常情况,比如内存分配失败、文件打开失败等。通过捕获异常并提供适当的处理代码,可以优雅地处理这些异常情况,而不是程序崩溃或终止。

程序运行:(32位操作系统中)

在这里插入图片描述

为什么编译时会报错 error C2148: 数组的总大小不得超过 0x7fffffff 字节?

这是因为在32位的操作系统中,一个单独的对象(包括数组)的大小不能超过2GB0x7fffffff字节)。这是由于32位操作系统的寻址空间限制所导致的。

当你使用 new 运算符来申请一个巨大的数组时,如果数组的总大小超过了这个限制,就会导致内存分配失败并抛出 bad_alloc 异常。

要解决这个问题,你可以考虑以下几种方法:

  1. 尝试使用64位的操作系统,这样可以拥有更大的寻址空间,从而支持更大的数组大小。
  2. 将数组拆分为多个较小的部分,分别进行内存分配和操作。
  3. 考虑使用其他数据结构或算法,以减少对巨大数组的需求。

需要注意的是,这个限制只适用于32位的操作系统。

在64位操作系统中,一个单独的对象(包括数组)的最大大小取决于操作系统和编译器的限制。通常情况下,64位操作系统的寻址空间非常大,可以支持非常大的对象大小。

在大多数64位操作系统中,一个单独的对象的最大大小可以达到几EB(exabytes),即数百万TB(terabytes)。这是一个非常大的值,超过了目前常见的内存容量。

需要注意的是,虽然64位操作系统可以支持非常大的对象大小,但实际可用的内存大小可能会受到硬件限制、操作系统限制和编译器限制的影响。

的内存容量。

需要注意的是,虽然64位操作系统可以支持非常大的对象大小,但实际可用的内存大小可能会受到硬件限制、操作系统限制和编译器限制的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值