body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

new/delete工作机制:
使用new表达式时发生的三个步骤:
1、调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象
2、运行该类型的一个构造函数去初始化对象
3、返回指向新分配并构造的构造函数对象的指针
使用delete表达式时,发生的步骤:
1、调用对象的析构函数
2、 调用名为operator delete的标准库函数释放该对象所用的内存
Student * pstu = new Student;
                new表达式:
                        a. opeartor new库函数 --> 专门用来开辟空间
                        b. 调用构造函数 --> 进行初始化
                        c. 返回所创建对象的首地址
                delete表达式:
                        a. 调用析构函数
                        b. 调用operator delete库函数 --> 释放申请的空间

operator new/delete
operator new 和operator delete函数有两个重载版本
void * operator new (size_t);
void * operator new[](size_t);
    void operator delete(void *);
    void operator delete[](void *);

只能生成栈对象
 不能通过new表达式来生成对象
1、将构造函数放入private区域
2、operator new函数 放入到private区域
private:
        void * operator new(size_t count);
        void operator delete(void * p);
//重写new/delete,可以不去实现,类外就不能调用new来创建对象

//只生产栈对象,不生成堆对象
//1.将构造函数放入private区域;  new生成堆对象的第二步就是要调用构造函数,设置为私有,new就不能成功
//2.operator new函数 放入到private区域
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
class Student
{
        private:
                int _id;
                char *_name;
                void * operator new(size_t count){}   //只是为了不生成堆对象,没必要重写
                void operator delete(void *p){}
        public:
                Student(int id,const char *name):_id(id)
                {
                        cout<<"Student()"<<endl;
                        _name = new char[strlen(name)+1];
                        strcpy(_name,name);
                }
                ~Student()
                {
                        cout<<"~Student()"<<endl;
                        delete []_name;
                        _name = NULL;
                }
                void print()const
                {
                        cout<<"id:"<<_id<<endl;
                        cout<<"name:"<<_name<<endl;
                }
};
int main(void)
{
        //Student *stu = new Student(110,"meihao");  //new 创建Student类对象时才会调用Student类内部重写的new、delete表达式
        Student stu1(110,"meihao");
        stu1.print();
        return 0;
}
只能生成堆对象
在创建栈对象时,不能调用构造函数或者析构函数
1、将构造函数放到private区域      //不可以

2、将析构函数放到private区域     //对于堆对象而言,执行 delete 表达式不能调用析构函数,表一不通过;public 声明 destory() 函数来进行资源释放 
//只创建堆对象
//将析构函数放到private区域
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
class Student
{
        private:
                int _id;
                char *_name;
        public:
                Student(int id,const char *name):_id(id)
                {
                        cout<<"Student()"<<endl;
                        _name = new char[strlen(name)+1];
                        strcpy(_name,name);
                }
        private:
                ~Student()
                {
                        cout<<"~Student()"<<endl;
                        delete []_name;
                        _name = NULL;
                }
        public:
                void destory()
                {
                        cout<<"destory()"<<endl;
                        delete this;  //只能创建堆对象,对象调用会传递this指针
                        //this->~Student();  //这个也可以
                }
                void print()const
                {
                        cout<<"id:"<<_id<<endl;
                        cout<<"name:"<<_name<<endl;
                }
};
int main(void)
{
        Student *stu1 = new Student(110,"meihao");
        stu1->print();
        //delete stu1;  //不能调析构函数,无法释放
        stu1->destory();
        //Student stu1(110,"meihao");  //析构函数是私有,可以创建对象但是不能释放,编译不通过
        return 0;
}
delete 和 delete[] 区别

 ///
/// @file    testDelete[].cpp
/// @author  meihao1203(meihao19931203@outlook.com)
/// @date    2018-08-11 19:47:35
///
#include<iostream>
using namespace std;
class A
{
        public:
                A():_a(new char[1])
                {
                        ++cnt;
                        cout<<"A()"<<endl;
                }
                ~A()
                {
                       delete []_a;
                        cout<<"~A()"<<cnt<<endl;
                }
        private:
                static int cnt;
                char* _a;
};
int A::cnt = 0;
int main()
{
        int* arr = new int[2];
        int* arr2 = new int[2];
        delete arr;
        delete []arr2;  //内置类型都能正常释放
        cout<<"------"<<endl;
        A* arr3 = new A[2];
        delete []arr3;
        cout<<"------"<<endl;
        A* arr4 = new A[2];  //只会调动一次析构函数
        delete arr4;
        return 0;
}
------
A()
A()
~A()2
~A()1
------
A()
A()
~A()2

//core dump
使用valgrind查看内存泄露:
内置类型,内存大小已经确定,系统可以记忆并且进行管理,在析构时不会调用析构函数。
类类型,delete ptr只用来释放ptr指向的内存。
delete []ptr用来指向ptr指向的内存,并逐一调用数组中每个对象的析构函数

new/delete工作机制的更多相关文章

  1. malloc 函数工作机制(转)

    malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将 ...

  2. BrnShop开源网上商城第三讲:插件的工作机制

    这几天BrnShop的开发工作比较多,所以这一篇文章来的晚了一些,还请大家见谅呀!还有通知大家一下BrnShop1.0.312版本已经发布,此版本添加了报表统计等新功能,需要源码的园友可以点此下载.好 ...

  3. 2014年2月5日 Oracle ORACLE的工作机制[转]

      网上看到一篇描写ORACLE工作机制的文章,觉得很不错!特摘录了下来.   ORACLE的工作机制-1 (by xyf_tck) 我们从一个用户请求开始讲,ORACLE的简要的工作机制是怎样的,首 ...

  4. OpenStack云平台的网络模式及其工作机制

    网络,是OpenStack的部署中最容易出问题的,也是其结构中难以理清的部分.经常收到关于OneStack部署网络方面问题和OpenStack网络结构问题的邮件.下面根据自己的理解,谈一谈OpenSt ...

  5. rsync工作机制(翻译)

    本篇为rsync官方推荐文章How Rsync Works的翻译,主要内容是Rsync术语说明和简单版的rsync工作原理.本篇没有通篇都进行翻译,前言直接跳过了,但为了文章的完整性,前言部分的原文还 ...

  6. OpenStack云平台网络模式及其工作机制

    转自:http://openstack.csdn.net/content.html?arcid=2808381 OpenStack云平台网络模式及其工作机制 网络,是OpenStack的部署中最容易出 ...

  7. tomcat中Servlet的工作机制

    在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init.service.destroy等方法 ...

  8. rsync(五)工作机制

    当我们讨论rsync时,我们使用了一些特殊的术语来代表不同的进程以及它们在任务执行过程中所扮演的角色.人类为了更方便.更准确地交流,使用同一种语言是非常重要的:同样地,在特定的上下文环境中,使用固定的 ...

  9. 大数据学习笔记——Spark工作机制以及API详解

    Spark工作机制以及API详解 本篇文章将会承接上篇关于如何部署Spark分布式集群的博客,会先对RDD编程中常见的API进行一个整理,接着再结合源代码以及注释详细地解读spark的作业提交流程,调 ...

随机推荐

  1. Visual studio插件 Reshaper--- 常用快捷键

    快速修复 alt+enter (alt+enter唤出快速修复面板,上下方向键进行选择,再次敲击enter键确定修改) 跳转到对象声明 ctl+鼠标左键 重构-重命名(ctl+r+r) esc键退出 ...

  2. cx_Oracle连接数据库总结

    python中连接oracle数据库使用第三方库文件cx_Oracle时遇到了各种问题,网上查找资料调试了几天才弄好,下面是不断调试后总结的一些经验.1.oracle客户端(Oracle Instan ...

  3. JAVA学习笔记之JAVA 对象引用以及赋值

      关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没 ...

  4. tab标签 插件 by 腾讯 jianminlu

    /** * @version 0.1 * @author jianminlu * @update 2013-06-19 15:23 */ (function ($) { /** * @name tab ...

  5. Jquery14 工具函数

    学习要点: 1.字符串操作 2.数组和对象操作 3.测试操作 4.URL 操作 5.浏览器检测 6.其他操作 工具函数是指直接依附于 jQuery 对象,针对 jQuery 对象本身定义的方法,即全局 ...

  6. 可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui)

    可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui) 0 前言 >>[前言].[第1节].[第2节].[第3节]. ...

  7. 解读:hadoop压缩格式

    Hadoop中用得比较多的4种压缩格式:lzo,gzip,snappy,bzip2.它们的优缺点和应用场景如下: 1). gzip压缩 优点:压缩率比较高,而且压缩/解压速度也比较快:hadoop本身 ...

  8. hdu5727

    Necklace SJX has 2*N magic gems. N of them have Yin energy inside while others have Yang energy. SJX ...

  9. Tars环境搭建之路

    搭建Tars可以通过两种方式:docker,linux原生方式 一:docker方式安装环境 这个方式相对来说简单多了 docker本质上是通过linux容器概念来实现复制软件集成环境,达到完美同步原 ...

  10. spark SQL学习(案例-统计每日uv)

    需求:统计每日uv package wujiadong_sparkSQL import org.apache.spark.sql.{Row, SQLContext} import org.apache ...