内存管理区域分为静态存储区,栈,堆。 程序编译执行的逻辑需要全局变量,局部变量,object,function 调用,类调用,静态变量和方法。
栈的结构,适合表示函数调用。 堆适合对象存储。
管理堆内存的行为有
- 申请(新申请的内存必须是物理连续的)。
- 删除(合并不连续的内存块,由内存管理器自动触发)。
- 寻找不使用的内存块进行垃圾回收。
RAII (Resource Acquisition Is Initialization)是c++特有的内存管理方式。
使用局部对象来管理资源的技术称为资源获取即初始化;这里的资源主要是指操作系统中有限的东西如内存、网络套接字等等,局部对象是指存储在栈的对象,它的生命周期是由操作系统来管理的,无需人工介入;
资源的使用一般经历三个步骤a.获取资源 b.使用资源 c.销毁资源,但是资源的销毁往往是程序员经常忘记的一个环节,所以程序界就想如何在程序员中让资源自动销毁呢?c++之父给出了解决问题的方案:RAII,它充分的利用了C++语言局部对象自动销毁的特性来控制资源的生命周期。给一个简单的例子来看下局部对象的自动销毁的特性:
#include <iostream>
using namespace std;
class person {
public:
person(const std::string name = "", int age = 0) :
name_(name), age_(age) {
std::cout << "Init a person!" << std::endl;
}
~person() {
std::cout << "Destory a person!" << std::endl;
}
const std::string& getname() const {
return this->name_;
}
int getage() const {
return this->age_;
}
private:
const std::string name_;
int age_;
};
int main() {
person p;
return 0;
}
编译并运行:
g++ person.cpp -o person
./person
运行结果:
Init a person!
Destory a person!
从person class可以看出,当我们在main函数中声明一个局部对象的时候,会自动调用构造函数进行对象的初始化,当整个main函数执行完成后,自动调用析构函数来销毁对象,整个过程无需人工介入,由操作系统自动完成;于是,很自然联想到,当我们在使用资源的时候,在构造函数中进行初始化,在析构函数中进行销毁。
引用参考: