对于static、const或者全局变量会有一块专门的静态数据区来保存,之后就可以在这种类型的生命期和访问范围内来使用对应类型的变量,这些类型的变量在编译期间就已经划分好存储区域并完成存储;
对于特定函数内部的局部变量,会在编译期间分配好其所需空间的大小,但是并不知道其某个变量的具体存储的地址(在内存中的位置),只会在运行的时候才会实时分配给变量具体的地址,这些变量所分配的存储空间实在程序运行时的栈上分配的,运行时分配和释放的方式、大小和时机都有编译器决定,是以压栈和弹栈的方式进行空间的分配和释放;
对于一些特定的比如数组,在声明的时候必须确定其长度,否则会报错,因为编译器在进行程序的编译期间会不知道到底分批多大的空间给这个变量,如果希望动态分配变量则要使用new和delete的方式进行分配和释放,这个时候分配的空间是从程序运行时的堆上分配的,编译器不处理这种空间的释放,必须有程序员自己进行动态的申请和空间的释放,如果申请后在不用的时候没有释放则会造成内存泄露,最终可能导致程序崩溃。
另外由于delete拿到的是指针指向的空间的内存地址,其实现机制是将指针指向的内存块标记修改说明这个块可以进行再分配,所以在delete一个指针之后,将这个指针的值置为0或者NULL是一个很好的习惯。(如果这个置空的工作由编译器自动完成就更好了,呵呵;但是这样就可能要修改delete后面的数据类型为**,否则拿不到这个指针所在的内存地址,就不可能将这个指针的内容置为NULL或者0)。