zoukankan      html  css  js  c++  java
  • C++——创建类的时候用new与不用new 的区别

    转自:https://www.cnblogs.com/tony-li/p/4111588.html

    C++在创建对象的时候可以采用两种方式:(例如类名为Test) Test test  或者 Test* pTest = new Test()。

            这两种方法都可以实例化一个对象,但是这两种方法有很大的区别,区别在于对象内容所在的内存空间不同,众所周知,内存的分配方式有三种      

    (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。       

    (2)  在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束后在将这些局部变量的内存空间回收。在栈上分配内存空间效率很高,但是分配的内存容量有限。  

    (3) 从堆上分配的。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。

            那么当使用Test test给对象分配内存空间的时候,是分配在堆中的还是栈中的呢?实践是检验真理的唯一标准,以程序为证:

     

    1. #include <iostream>  
    2. using namespace std;  
    3.   
    4. class TestNew  
    5. {  
    6. private:  
    7.     int ID;  
    8. public:  
    9.     TestNew(int ID);  
    10.     ~TestNew();  
    11. };  
    12.   
    13. TestNew::TestNew(int ID)  
    14. {  
    15.     this->ID = ID;  
    16. }  
    17.   
    18. TestNew::~TestNew()  
    19. {  
    20.     std::cout<<"对象 "<<this->ID<<" 执行析构函数"<<std::endl;  
    21. }  
    22. void Test()  
    23. {  
    24.     TestNew test(1);//创建对象1,不使用new  
    25.     TestNew *pTest = new TestNew(1);//创建对象2,使用new  
    26. }  
    27.   
    28. int main()  
    29. {  
    30.     Test();//这个地方有点问题,pTest没有进行处理,会导致内存泄露,实际应用中要注意呀  
    31. }  

    从运行结果中,我们可以得出在不使用new创建对象时,对象的内存空间是在栈中的,其作用范围只是在函数内部,函数执行完成后就会调用析构函数,删除该对象。

    使用new创建对象是创建在堆中的,必须要程序员手动的去管理该对象的内存空间。

    既然选择了远方,就不顾风雨兼程
  • 相关阅读:
    Infopath Notify 弹出提示信息
    window.showModalDialog 返回值
    【转】获得正文内容中的所有img标签的图片路径
    Json Datable Convert
    Sharepoint 列表 附件 小功能
    Surgey 权限更改
    SQL 触发器用于IP记录转换
    Caml语句 查询分配给当前用户及当前组
    jquery 1.3.2 auto referenced when new web application in VSTS2010(DEV10)
    TFS diff/merge configuration
  • 原文地址:https://www.cnblogs.com/zhengfa-af/p/8109958.html
Copyright © 2011-2022 走看看