new内存时,数组长度为0

本文探讨了C++中new操作符用于创建0长度数组时的行为及潜在问题,包括尝试访问空数组元素可能导致的未定义行为,以及释放这类数组时可能出现的异常情况。

c++ new的时候,如果长度为0,虽然会有指针产生,但是 则会产生意想不到的错误,


int * array = new int[0];


array[0] = 0;


虽然能访问,但是,取决于正在访问的内存是不是有人在使用或占用,如果有人使用,则该内存不是野内存,会报错;


o长度的动态分配数组,delete的时候也会有报错出现,找不到内存;


这种情况要注意。

### 创建数组指定长度分配内存的原理 在不同的编程语言中,创建数组指定长度以分配内存的原理有所不同,但总体上都是向操作系统请求一块连续的内存空间来存储数组元素。 #### Java 在 Java 中,使用 `new` 关键字创建数组,会在堆内存中分配一块连续的内存空间,其大小由指定的数组长度数组元素类型决定。例如,对于一个 `int` 类型的数组,每个元素占用 4 个字节,如果数组长度为 `n`,则会分配 `4 * n` 字节的连续内存空间。示例代码如下: ```java int[] array = new int[10]; ``` 这里创建了一个长度为 10 的 `int` 类型数组,Java 会在堆内存中分配 40 字节(`4 * 10`)的连续空间来存储这 10 个 `int` 元素。 #### C++C++ 中,使用 `new` 运算符创建数组,同样会在堆内存中分配连续的内存空间。例如: ```cpp int* array = new int[10]; ``` 此代码创建了一个长度为 10 的 `int` 类型数组C++ 会在堆内存中分配 40 字节(`4 * 10`)的连续空间。与 Java 不同的是,C++ 需要手动使用 `delete[]` 来释放内存,以避免内存泄漏: ```cpp delete[] array; ``` #### C 在 C 语言中,使用 `malloc` 或 `calloc` 函数来动态分配内存。例如使用 `malloc`: ```c #include <stdio.h> #include <stdlib.h> int main() { int* array = (int*)malloc(10 * sizeof(int)); if (array == NULL) { printf("内存分配失败\n"); return 1; } // 使用完后释放内存 free(array); return 0; } ``` 这里 `malloc` 函数会从系统堆上分配 `10 * sizeof(int)` 字节的连续内存空间,并返回指向该内存空间起始地址的指针。如果分配失败,返回 `NULL`。使用完后需要使用 `free` 函数释放内存。 ### 创建数组指定长度分配内存的方法 #### Java ```java // 基本数据类型数组 int[] intArray = new int[5]; double[] doubleArray = new double[3]; // 引用数据类型数组 String[] stringArray = new String[4]; ``` #### C++ ```cpp // 基本数据类型数组 int* intArray = new int[5]; double* doubleArray = new double[3]; // 自定义类型数组 class MyClass { public: int value; }; MyClass* myClassArray = new MyClass[2]; // 释放内存 delete[] intArray; delete[] doubleArray; delete[] myClassArray; ``` #### C ```c #include <stdio.h> #include <stdlib.h> int main() { // 基本数据类型数组 int* intArray = (int*)malloc(5 * sizeof(int)); double* doubleArray = (double*)malloc(3 * sizeof(double)); // 检查是否分配成功 if (intArray == NULL || doubleArray == NULL) { printf("内存分配失败\n"); return 1; } // 释放内存 free(intArray); free(doubleArray); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

seasermy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值