delete 和 delete[] 都用于释放动态分配的内存的操作符。它们之间的主要区别在于它们所处理的对象类型不同。
delete 用于释放单一对象的内存。对于简单类型,计算好大小后创建内存,对于复杂结构,先调用计算并分配内存,然后在分配的内存上调用构造函数。如下为样例代码:
int* val = new int; // 使用 new 分配一个整型内存
delete val; // 使用 delete 释放内存
delete[] 用于释放对象数组的内存,如下为样例代码:
int* vals = new int[10]; // 使用 new 分配一个长度为 10 的整型数组内存
delete[] vals; // 使用 delete[] 释放内存
delete[] 的原理:在使用 new[] 操作符来动态分配数组时,内存管理器会为数组分配一块连续的内存空间,这个内存空间大小并不等于对象大小*数组长度,而是多了 8 个字节( x64 编译),这 8 个字节就是数组长度。在使用 delete[] 操作符来释放这块内存时,便能够从该内存中读取数组长度,从而完整的释放整个数组占用的内存空间,并将该内存空间标记为可用。
值得注意的是多维数组的内存释放(需要使用循环):
int** vals = new int*[2];
for (size_t i = 0; i < 2; i++)
{
vals[i] = new int[3]();
}
for (size_t i = 0; i < 2; i++)
{
delete[] vals[i]; //注意 delete 一定要加上中括号 []
}
(1)一维数组的遍历
方式一:for 循环遍历
int vals[6]{};
for (size_t i = 0; i < sizeof(vals) / sizeof(int); i++)
{
printf("%d ", vals[i]);
}
注意计算一维数组长度的方法:sizeof(vals) / sizeof(int)
,也可以使用 sizeof(vals) / sizeof(vals[0])
方式二:基于范围的 for 循环遍历
基于范围的 for 循环是在 C++11 标准中推出的新的语法,相比于传统的 for 循环,该方法无需关注数组的起始与长度,更适用于开发。
int vals[6]{};
for (const auto& val : vals)
{
printf("%d ", val);
}
(2)多维数组的遍历
方式1:for 循环遍历
使用数组各维度长度作为循环变量的范围(推荐)
int valLists[2][3] = { 1,2,3,4,5,6 };
for (size_t i = 0; i < 2; i++)
{
for (size_t j = 0; j < 3; j++)
{
printf("%d ", valLists[i][j]);
}
}
使用 sizeof 运算符计算,但是需要注意计算方法(不推荐,计算较为复杂)
int valLists[2][3] = { 1,2,3,4,5,6 };
for (size_t i = 0; i < sizeof(valLists)/ sizeof(valLists[0]); i++)
{
for (size_t j = 0; j < sizeof(valLists[0]) / sizeof(int); j++)
{
printf("%d ", valLists[i][j]);
}
}
方式2:基于范围的 for 循环遍历
基于范围的 for 循环是用于多维数组更为方便,不需要考虑每个维度的长度。
int valLists[2][3] = { 1,2,3,4,5,6 };
for (const auto& vals : valLists)
{
for (const auto& val : vals)
{
printf("%d ", val);
}
}
动态数组是指在运行时大小可以改变的数组。与静态数组不同,动态数组的大小是可以在程序运行时被修改,而不是在编译时确定的。可以使用 C++ 标准库中的 std::vector 来实现动态数组。
std::vector 提供了类似于数组的接口,但可以在运行时动态地调整大小。使用 std::vector 可以方便地添加、删除和访问元素,同时它还提供了许多有用的成员函数,如 push_back() 、 pop_back() 、 resize() 等。如下为样例代码:
#include
#include
using namespace std;
int main()
{
// 创建包含 6 个元素的vector
vector<int> vals = { 1, 2, 3, 4, 5, 6 };
// 访问数组中的元素
vals[0] = 10;
vals[1] = 15;
// 向数组中添加元素
vals.push_back(20);
vals.push_back(21);
vals.push_back(22);
// 遍历数组并输出每个元素
for (auto it = vals.begin(); it != vals.end(); it++)
{
printf("%d ", *it);
}
printf("\n");
return 0;
}
上面代码输出:
10 15 3 4 5 6 20 21 22