网站建设公司哪家好,找建设网站公司哪家好,淘宝网站做多久,做网站送的企业邮箱能用吗如果你是Java、C#、PHP程序员#xff0c;那么会对 new 非常熟悉#xff0c;在这些编程语言中#xff0c;只能通过 new 来创建对象。在C中#xff0c;你可以像定义变量一样来创建对象#xff0c;如#xff1a; Student stu; //对象已被实例化#xff0c;已分配内存空间那么会对 new 非常熟悉在这些编程语言中只能通过 new 来创建对象。在C中你可以像定义变量一样来创建对象如 Student stu; //对象已被实例化已分配内存空间可以使用了stu.say(); //调用成员函数 这种情况下系统会在栈区为对象分配内存。栈区是内存中的一块区域由系统自动分配和释放程序员无法操控一般用来存放函数的参数值、局部变量、局部对象等。当发生函数调用时系统将函数参数、局部变量、局部对象依次压入栈区函数执行结束再按照先进后出的原则将它们弹出销毁。对于大部分程序这不会有什么问题。但当你希望在函数调用结束前销毁对象时你是无能为力的。或者你希望通过 for 循环来创建多个对象这种方法同样也做不到。这个时候 new 和 delete 就派上了用场使用 new 创建的对象可以在任意时刻通过 delete 销毁而且只需要一个指针指向它。以前面的 Student 类为例可以这样来动态创建对象
new Student;
也可以使用构造函数
new Student(小明, 15, 90.5f);
这样就在堆区为对象分配了内存并调用了构造函数。但是此时程序员还无法访问这个对象因为这个对象既没有名字也没有指针指向它。这种对象称为
匿名对象
它确实存在但无法访问。用一个指针来指向Student类的对象
Student *pStu;
pStu new Student(小明, 15, 90.5f);
或者
Student *pStu new Student(小明, 15, 90.5f); 当不再需要对象时可以通过 delete 销毁
delete pStu;
这样就释放掉了对象占用的内存并调用了析构函数。需要说明的是new 在堆区为对象分配内存。与栈区不同的是堆区内存由程序员分配和释放系统不会自动销毁即使函数调用结束了仍然会保留堆区内存。如果程序员不主动回收堆区内存那么只能在程序运行结束后由操作系统回收。为了避免内存泄露强烈建议 new 和 delete 成对出现及时销毁不再需要的对象。例如下面的代码会造成严重的内存泄露 #include iostream#include cstdlibusing namespace std;class Demo{private: double n; double m; int i;};void func(){ Demo *p new Demo;}int main(){ int i; for(i1; i1000000; i){ func(); } system(pause); return 0;} 当程序运行到 system(pause); 语句时你可以打开任务管理器会发现这个小小的程序竟然占用了 32M 内存。这是因为每次调用 func 函数都会创建一个对象并用 p 指向它。函数运行结束仅仅释放了指针变量 p 占用的内存而没有释放 p 所指向的对象占用的内存。如果在 func 函数中不回收对象内存那么你将永远无法回收只能等到程序运行结束由操作系统回收这就是典型的内存泄露。另外注意C语言中的 malloc、free 函数不能用来为对象分配和释放内存。请看下面的例子 #include iostreamusing namespace std;class Demo{public: Demo(); ~Demo();};Demo::Demo(){ coutConstructorendl;}Demo::~Demo(){ coutDestructorendl;}int main(){ cout------new------endl; Demo *p1 new Demo; //创建一个对象 Demo *p2 new Demo[5]; //创建一组对象 cout------malloc------endlendl; Demo *p3 (Demo*)malloc(sizeof(Demo)); cout------delete------endl; delete p1; //销毁一个对象 delete[] p2; //销毁一组对象 cout------free------endl; free(p3); return 0;} 运行结果------new------ConstructorConstructorConstructorConstructorConstructorConstructor------malloc------------delete------DestructorDestructorDestructorDestructorDestructorDestructor------free------从程序运行结果可以看出malloc 虽然分配了内存但没有调用构造函数free 虽然释放了内存但也没有调用析构函数。