内存管理是C/C++程序员必须掌握的基本知识之一。下面是一些基本的C/C++内存管理知识点:
堆内存和栈内存
C/C++中的内存可以分为堆内存和栈内存两种。栈内存是由操作系统自动管理的,当一个函数被调用时,它的参数、局部变量和返回地址等都被存放在栈上,栈会在函数返回时自动回收这些内存。堆内存则是由程序员手动分配和释放的,它的生命周期由程序员来管理。
malloc和free
在C语言中通常使用malloc函数来动态分配堆内存,使用free函数来手动释放堆内存:
int arr = (int) malloc(5 * sizeof(int)); // 分配5个int类型大小的内存
// 使用arr
free(arr); // 还原这些内存
c
new和delete
在C++中通常使用new运算符来动态分配堆内存,使用delete运算符来手动释放堆内存:
int *arr = new int[5]; // 分配5个int类型大小的内存
// 使用arr
delete [] arr; // 还原这五个内存
c++
注意,C++中使用new和delete时需要使用[]来分配和释放数组类型的内存。
内存泄漏和野指针
内存泄漏是指程序在使用完某段堆内存后,未将其还原到操作系统,从而造成系统的内存资源浪费。野指针则是指指向已经被释放的堆内存的指针,它的使用会导致程序崩溃或其他不可预测的错误。
例如:
int *p = new int; // 分配一个int类型大小的内存
p = NULL; // p现在变成了野指针
delete p; // delete一个NULL指针是安全的,但是这并没有释放p分配的内存
c++
RAII
典型的C++内存管理方式是RAII(Resource Acquisition Is Initialization),也称资源获取即初始化。RAII使用对象的生命周期来管理资源的获取和释放,当对象的生命周期结束时,系统会自动调用析构函数来释放所获取的资源。
例如:
class MyArray {
public:
MyArray(int N): size(N), data(new int[N]) {}
~MyArray() { delete [] data; } // 在析构函数中手动释放堆内存
private:
int size;
int *data_;
};
int main() {
MyArray arr(5); // 在栈上实例化一个MyArray对象,会自动在对象释放时释放data_所指的堆内存
return 0;
}
c++
以上是C/C++内存管理的一些基本知识点。为了避免内存泄漏和野指针等问题,程序员应该尽可能地使用RAII和智能指针等现代的内存管理方式。