C++ 内存管理 1

181 阅读2分钟

内存管理区域分为静态存储区,栈,堆。 程序编译执行的逻辑需要全局变量,局部变量,object,function 调用,类调用,静态变量和方法。

栈的结构,适合表示函数调用。 堆适合对象存储。

管理堆内存的行为有

  1. 申请(新申请的内存必须是物理连续的)。
  2. 删除(合并不连续的内存块,由内存管理器自动触发)。
  3. 寻找不使用的内存块进行垃圾回收。

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函数执行完成后,自动调用析构函数来销毁对象,整个过程无需人工介入,由操作系统自动完成;于是,很自然联想到,当我们在使用资源的时候,在构造函数中进行初始化,在析构函数中进行销毁。

引用参考:

time.geekbang.org/column/arti…

zhuanlan.zhihu.com/p/34660259