标签:
2. static 局部对象在函数调用结束时并不销毁,因此也不调用析构函数,
只有在程序结束时(如 main 函数结束或调用 exit 函数)才调用 static 局部对象的析构函数。
3) 如果定义了一个全局对象,也只有在程序结束时才会调用该全局对象的析构函数。
#include <iostream> #include <cstdlib> using namespace std; class Demo{ private: double n; double m; int i; }; void func(){ Demo *p = new Demo; } int main(){ int i; for(i=1; i<=1000000; i++){ func(); } system("pause"); return 0; }
当程序运行到 system("pause"); 语句时,你可以打开任务管理器,会发现这个小小的程序竟然占用了 32M 内存。
这是因为每次调用 func 函数,都会创建一个对象,并用 p 指向它。函数运行结束,仅仅释放了指针变量 p 占用的内存,而没有释放 p 所指向的对象占用的内存。
如果在 func 函数中不回收对象内存,那么你将永远无法回收,只能等到程序运行结束(return 后)由操作系统回收,这就是典型的内存泄露。 (new, delete 成对出现)
4 new delete 调用构造、析构函数
malloc, free 不调用构造、析构函数
1. this 作为隐式参数,本质上是成员函数的局部变量,不占用对象的内存,只有在发生成员函数调用时才会给 this 赋值,函数调用结束后,this 被销毁。
2. 成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。这个额外的参数,实际上就是 this,它是成员函数和成员变量关联的桥梁。
static 成员变量与对象无关,不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问。static 成员变量和普通 static 变量一样,编译时在静态数据区分配内存,到程序结束时才释放。
静态成员变量必须初始化,而且只能在类体外进行。例如:初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化,一般是 0。静态数据区的变量都有默认的初始值,而动态数据区(堆区、栈区)的变量默认是垃圾值。
int Student::num = 10; //private, protected, public 初始化情况都一样。
1. 当调用一个对象的成员函数(非静态成员函数)时,系统会把当前对象的起始地址赋给 this 指针。
静态成员函数并不属于某一对象,它与任何对象都无关,因此静态成员函数没有 this 指针。既然它没有指向某一对象,就无法对该对象中的非静态成员进行访问。
可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有 this 指针,而静态成员函数没有 this 指针。由此决定了静态成员函数不能访问本类中的非静态成员。
标签:
原文地址:http://my.oschina.net/u/573270/blog/513906