动态内存分配
基本概念:
静态内存分配:编译时分配内存,内存在整个程序运行期间一直存在,如全局变量和局部变量。
动态内存分配:运行时根据需要分配内存,可以在程序运行期间灵活地申请和释放内存,适用于需要灵活大小的数据结构,如动态数组、链表等。
new 操作符
基本用法:
new 操作符用于在堆内存中分配内存,并返回指向分配内存的指针。
语法:
pointer_variable = new data_type;
pointer_variable = new data_type[size];
示例:
#include <iostream>
int main() {
// 分配一个整数
int* p = new int;
*p = 10;
std::cout << "动态分配的整数值: " << *p << std::endl;
// 分配一个整数数组
int* arr = new int[5];
for (int i = 0; i < 5; ++i) {
arr[i] = i * 2;
}
std::cout << "动态分配的数组: ";
for (int i = 0; i < 5; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
// 释放内存
delete p;
delete[] arr;
return 0;
}
delete 操作符
基本用法:
delete 操作符用于释放先前通过new分配的内存,避免内存泄漏。
语法:
delete pointer_variable;
delete[] pointer_variable;
示例:
#include <iostream>
int main() {
// 分配和释放单个变量
int* p = new int;
*p = 10;
std::cout << "动态分配的整数值: " << *p << std::endl;
delete p;
// 分配和释放数组
int* arr = new int[5];
for (int i = 0; i < 5; ++i) {
arr[i] = i * 2;
}
std::cout << "动态分配的数组: ";
for (int i = 0; i < 5; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
delete[] arr;
return 0;
}
注意事项
内存泄漏:如果忘记使用delete释放通过new分配的内存,会导致内存泄漏,程序会消耗越来越多的内存。
重复释放:不能对同一块内存使用delete多次,这会导致未定义行为。
空指针:对空指针使用delete是安全的,不会产生任何效果。
匹配:对于单个对象使用delete,对于数组使用delete[],不匹配的释放方式会导致未定义行为。
示例:避免内存泄漏
#include <iostream>
void memoryLeakExample() {
int* leak = new int[10]; // 没有释放内存,导致内存泄漏
}
void properMemoryManagement() {
int* noLeak = new int[10];
// 正确的内存释放
delete[] noLeak;
}
int main() {
memoryLeakExample();
properMemoryManagement();
return 0;
}
总结
动态内存分配通过new和delete操作符可以灵活地管理内存,提高程序的灵活性和效率。然而,需要小心避免内存泄漏和未定义行为,确保每个new都有对应的delete来释放内存。