ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

new和delete究竟做了什么?

2019-04-28 19:50:43  阅读:209  来源: 互联网

标签:调用 string 对象 sp new delete 究竟


  作为一个c++初学者,只是简单的认为new就是新建一个对象,delete就是删除一个对象。而在面对下面一个问题时,就感觉有些困惑,new和delete到底做了什么?

  问题是:给定下面的类,为其实现一个默认构造函数和必要的拷贝控制成员。

  

class TreeNode{
private:
    std::string value;
    int         count;
    TreeNode    *left;
    TreeNode    *right;
};

  如果我们简单的把当前结点删了,那么对于后面的节点我们就没办法删除了。

  (这里我认为delete函数只是删除掉指针所指对象,但是怎么样删除的还不太了解。)

   而如果要对每个左右结点调用delete,那我们不是要不断判断后续结点是否存在,然后一一删除吗?我的一个想法是难道需要递归吗?但是又如何递归调用delete呢?

   等我查阅了一些相关资料,明白了new和delete的工作机理,才知道原来是这样。

以下内容摘自c++ primer 第五版 726页

  当我们使用一条new表达式时:

  

//new表达式
string *sp = new string("a value");    //分配并初始化一个string对象
string *arr = new string[10];          //分配10个默认初始化的string对象

  实际上执行了三步操作:

  1.new表达式调用一个名为 operator new (或者 operator new[])的标准库函数。该函数分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象(或对象的数组)。

  2.编译器运行相应的构造函数以构造这些对象,并传入初始值。

  3.对象被分配了空间并构造完成,返回一个指向该对象的指针。

 

  当我们使用delete表达式删除一个动态分配的对象时:

  

delete sp;         //销毁*sp,然后释放sp指向的内存空间
delete [] arr;     //销毁数组中元素,然后释放对应的内存空间

  1.对sp所指对象或者arr所指的数组中的元素执行对应的析构函数。

  2.编译器调用名为operator delete( 或者 operator delete []) 的标准库函数释放内存空间。

 

  这里可以明白一个问题,当我们delete一个类对象指针时会发生什么。会调用类的析构函数。

  如果类里面还有该类的对象呢? 对该类的对象调用析构函数。不断重复调用析构函数,直到全部都被析构。

标签:调用,string,对象,sp,new,delete,究竟
来源: https://blog.csdn.net/birdunderastarrysky/article/details/89644161

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有