C++ 动态内存分配相关总结
C++ 中的动态内存分配是通过 new
和 delete
进行的,它们可以用来在程序运行时分配和释放内存。相比于静态内存分配,它具有更高的灵活性和可扩展性。
动态内存分配的基本使用
分配动态内存
new
运算符可以分配指定大小的动态内存,返回的是分配内存的首地址,需要通过指针接收:
// 分配一个 int 类型的动态数组
int *p = new int[10];
释放动态内存
使用分配内存时返回的指针,可以通过 delete
运算符将该内存释放掉:
delete[] p;
动态内存分配的异常处理
动态内存分配申请内存时可能会失败,比如内存空间不足,此时 new
返回空指针,可以使用 try...catch
语句进行异常处理:
try {
int *p = new int[10000000];
}
catch (std::bad_alloc &ex) {
std::cout << "动态内存分配失败:" << ex.what() << std::endl;
return -1;
}
动态内存分配的注意事项
内存泄漏
动态内存分配后,需要及时释放,否则会造成内存泄漏,导致程序运行过程中内存不断累积,最终导致严重的系统崩溃。
int main() {
while (true) {
// 分配一个 int 类型的动态数组
int *p = new int[10000];
}
return 0;
}
在上述代码中,每次循环分配了一个 int 类型的动态数组,但是没有进行释放,最终导致内存泄漏,程序会占用越来越多的内存,最终会因为内存耗尽而崩溃。
越界访问
动态分配内存时,需要注意数组的大小,否则会发生越界访问的问题。
int main() {
// 分配一个 int 类型的动态数组
int *p = new int[10];
// 访问数组时,要确保下标在合法范围内
p[10] = 0;
// 释放内存
delete[] p;
return 0;
}
在上述代码中,数组大小只分配了 10 个 int 类型的空间,但是访问了第 11 个元素,导致了越界访问的问题。
示例1:动态分配二维数组
使用动态内存分配可以方便地分配二维数组,其基本方法是先分配一维数组,然后在循环中为每个一维数组分配二维数组的空间。
int **Create2DArray(int row, int col) {
// 分配一维数组
int **arr = new int *[row];
// 分配二维数组
for (int i = 0; i < row; ++i) {
arr[i] = new int[col];
}
return arr;
}
在这个函数中,我们首先分配了一个包含 row 个指针的数组,然后循环遍历每个指针,为它分配 col 个 int 类型的空间。最终返回这个二维数组的指针。
示例2:动态分配结构体数组
使用动态内存分配,可以轻松地分配结构体数组,可以使用动态内存分配的方式来实现:
struct Student {
std::string name;
int age;
};
Student *CreateStudentArray(int n) {
// 分配结构体数组的空间
Student *arr = new Student[n];
// 对数组进行初始化
for (int i = 0; i < n; ++i) {
arr[i].name = "John Doe";
arr[i].age = 20;
}
return arr;
}
在这个函数中,我们首先分配了一个包含 n 个结构体的数组,然后循环遍历每个结构体,对其中的字符串和整数进行初始化。最终返回这个结构体数组的指针。
以上是对于 C++ 动态内存分配的相关总结,包括了基本使用方法、注意事项及两个示例说明。在程序设计中,动态内存分配可以帮助我们快速方便地分配内存,提高程序的灵活性和可扩展性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++ 动态内存分配相关总结 - Python技术站