目录
引言
本文主要记录了使用C++(不是C语言)动态分配内存的方法。
动态内存分配是C++编程中的一个重要概念,它允许程序在运行时根据需要分配和释放内存。理解这一概念对编写高效、灵活的程序至关重要。
1. 何为内存分配
内存分配指的是在程序运行时,向程序提供所需的内存空间。内存分配分为静态内存分配和动态内存分配。
- 静态内存分配:在编译时确定内存的大小和位置,分配的内存在整个程序运行期间一直存在。局部变量和全局变量就是采用静态内存分配。(系统自动分配)
- 动态内存分配:在程序运行时根据需要分配内存,内存的大小和位置可以在运行时动态改变。动态内存分配的内存需要程序员手动释放,以避免内存泄漏。(程序员手动分配)
2. 静态内存分配
如下是两种静态内存分配:
int main(){
int num = 100;
cout << num << endl;
// 其他代码
return 0;
}
int main(){
int nums[] = { 1, 2, 3, 4, ..., 999999}; // 模拟很大内存的数组
//使用nums数组
// 其他代码
return 0;
}
- 如果整型变量num和整型数组nums在使用后,后续的程序中没有任何作用了,那么num和nums会一直占用内存空间,直至程序运行结束。
3. 为何要使用动态内存分配
动态内存分配提供了以下几个主要优势:
- 灵活性:可以根据程序的需求动态分配和释放内存,使得程序可以处理不同规模的数据。
- 高效性:避免了预先分配大量内存导致的浪费。程序可以在需要时分配内存,释放不再需要的内存,提升内存利用率。
- 复杂数据结构:支持动态数据结构如链表、树、图等,这些数据结构的大小在编译时无法确定。
4. 方法
在C++中,动态内存分配主要通过new
和delete
操作符来实现。( C语言中使用的是malloc
和free
函数)。下面详细介绍new
和delete
的使用。
new
操作符:用于在堆上分配内存。new
返回一个指向分配内存的指针。
int* p = new int; // 分配一个int类型的内存
int* arr = new int[10]; // 分配一个包含10个int的数组
delete
操作符:用于释放由new
分配的内存,避免内存泄漏。
delete p; // 释放一个int类型的内存
delete[] arr; // 释放一个数组的内存
完整使用示例:
#include <iostream>
using namespace std;
int main(){
// 单个变量的动态内存分配
int *p_int = new int;
//使用
*p_int = 100;
cout << "new申请的" << sizeof(int) << "个字节空间内,存放的值是:" << *p_int << endl;
delete p_int; // 结束使用
cout << "--------------------" << endl;
//数组的动态内存分配
int* p_arr = new int[5];
// 使用
p_arr[0] = 100;
p_arr[1] = 200;
p_arr[2] = 300;
p_arr[3] = 400;
p_arr[4] = 500;
cout << "数组的第一个元素的值为:" << *p_arr << endl;
cout << "数组的第二个元素的值为:" << p_arr[1] << endl; // p_arr[i] = *(p_arr + i)
cout << "数组的第三个元素的值为:" << *(p_arr + 2) << endl;
cout << "数组的第四个元素的值为:" << *(p_arr + 3) << endl;
cout << "数组的第五个元素的值为:" << *(p_arr + 4) << endl;
cout << "数组的元素个数为:" << sizeof(p_arr) / sizeof(int) << endl;
delete[] p_arr; // 结束使用
return 0;
}
运行结果:
5. 注意事项
- 内存泄漏:如果动态分配的内存没有被正确释放,会导致内存泄漏。程序运行时间越长,内存泄漏越严重,可能导致系统崩溃。
- 空指针:使用动态分配内存的指针前,一定要确保其不为null,避免非法访问。
- 数组分配和释放:分配数组内存时使用
new[]
,释放时要使用delete[]
,否则可能导致未定义行为。 - 高危操作:
delete只能释放由new申请的内存空间,即只能释放动态分配(new)的内存。否则会报错(delete 变量)或内存高危操作(delete &变量)。