C++ 内存基本构件new/delete的意义、运用方式以及重载方式

目录

  • 一、对new的理解
    • 1、new做了什么
    • 2、new被编译器转为了什么
    • 3、operate_new源代码长啥样
  • 二、对delete的理解
    • 1、delete做了什么
    • 2、delete被编译器转为了什么
    • 3、operator delete源代码长啥样
  • 三、构造函数与析构函数的直接调用
  • 参考

一、对new的理解

1、new做了什么

C++告诉我们,new的时候会分配一块内存用来放对象,分配好之后会调用构造函数。所以说所谓的自动调用,其实是被new调用的。
所以总结new做的动作:1、分配内存 2、调用构造函数

2、new被编译器转为了什么

以下面语句为例:

Complex* pc = new Complex(1,2);

仿造编译器的流程,可以具化为:

try{//1、allocatevoid* mem = operate_new(sizeof(Complex));//2、cast,将指针转型为Complex*类型指针pc = static_cast<Complex*>(mem);//3、construct,注意这种写法只有编译器才能使用,我们需要避免这种行为pc->Complex::Complex(1,2);
}
catch(std::bad_alloc){//若allocation失败就不执行构造函数
}

注意第3点,如果想要直接调用ctor,可以使用placement new:

new(p)Complex(1,2);

3、operate_new源代码长啥样

这里截取的是vc98版本的源代码:
在这里插入图片描述
可见,如果分配内存成功,就返回分配到的内存的指针,否则陷入while循环中。
什么时候会失败?大量耗用内存之后,我们需要new一个对象,会发现我们调用不到内存了。
这时会使用callnewh函数,即调用newhandle函数,这是一种自设定的函数。也就是说,分配内存失败就会调用你设定的那个函数。我们需要在newhandle函数中释放内存,以便调用完newhandle函数后会有内存给malloc分配。
关于函数的第二个参数
nothrow与异常的抛出有关,它是不抛异常,意思是说operate_new这个函数是
保证不抛异常的
,在新版的C++特性中,不抛异常的写法有做修改。
它的解释如下:
struct std::nothrow_t {};

The struct is used as a function parameter to operator new to indicate that the function should return a null pointer to report an
allocation failure, rather than throw an exception.

二、对delete的理解

1、delete做了什么

C++告诉我们,delete的时候会先调用析构函数,然后调用delete函数释放内存。

2、delete被编译器转为了什么

先调用delete函数:

Complex* pc = new Complex(1,2);
...
delete pc;

被编译器转为:

pc->~Complex();			//先析构,注意这里可以直接调用析构函数
operator delete(pc);	//然后释放内存

3、operator delete源代码长啥样

也就是直接调用free函数。
在这里插入图片描述
总结一下,new与delete调用的是operate_new和operator delete。而operate_new调用的是malloc函数,operator delete调用的是free函数。

三、构造函数与析构函数的直接调用

先通过指针调用构造函数,这里先选择string类,因为string在标准库里面是个typedefine,本名为basic_string。编译器把第一个string换成了basic_string,后面再找string没有找到,所以这里会报错。这个并不是真正不能使用构造函数的原因。
例1:

 string* pstr = new string;cout << "str= " << *pstr << endl;//! pstr->string::string("jjhou");  //[Error] 'class std::basic_string<char>' has no member named 'string'
//! pstr->~string();	//crash -- 其語法語意都是正確的, crash 只因為上一行被 remark 起來嘛.  cout << "str= " << *pstr << endl;

例2:
可以看到在GCC里面通过指针或者直接调用构造函数是不正确的,在VC中,条件会放宽。

class A
{
public:int id;A() : id(0)      { cout << "default ctor. this="  << this << " id=" << id << endl;  }A(int i) : id(i) { cout << "ctor. this="  << this << " id=" << id << endl;  }~A()             { cout << "dtor. this="  << this << " id=" << id << endl;  }
};A* pA = new A(1);         	//ctor. this=000307A8 id=1cout << pA->id << endl;   	//1
//!	pA->A::A(3);                //in VC6 : ctor. this=000307A8 id=3//in GCC : [Error] cannot call constructor 'jj02::A::A' directly//!	A::A(5);	  				//in VC6 : ctor. this=0013FF60 id=5//         dtor. this=0013FF60  	//in GCC : [Error] cannot call constructor 'jj02::A::A' directly//         [Note] for a function-style cast, remove the redundant '::A'cout << pA->id << endl;   	//in VC6 : 3//in GCC : 1  	delete pA;                	//dtor. this=000307A8 

参考

https://www.bilibili.com/video/BV1Kb411B7N8?p=7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二、线性代数

一、张量 张量表示由一个数值组成的数组&#xff0c;这个数组可能有多个维度 import torchx torch.arange(15) x # tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])1&#xff0c;shape shape属性可以访问张量的形状 x.shape # torch.Size([15])2&a…

Wordpress prettyPhoto插件跨站脚本漏洞

漏洞名称&#xff1a;Wordpress prettyPhoto插件跨站脚本漏洞CNNVD编号&#xff1a;CNNVD-201311-413发布时间&#xff1a;2013-11-28更新时间&#xff1a;2013-11-28危害等级&#xff1a; 漏洞类型&#xff1a;跨站脚本威胁类型&#xff1a;远程CVE编号&#xff1a; 漏洞来源…

JavaScript学习笔记1

Netscape 公司 DOM模型&#xff0c;层(layer)-用ID标识。 HTML标记页面上的元素&#xff0c; <div id "mydiv">This is my div</div> CSS为这个页面元素定位 #mydiv{ position:absolute; left:320px; top:110px; } JavaScript 访问 (DOM模块不同&#x…

c# 中关键字_C#中的“使用”关键字

c# 中关键字Prerequisite: Namespace in C# 先决条件&#xff1a; C&#xff03;中的命名空间 If you want to include namespace in a program then we need to use using keyword. For example we use Console class which is defined in System namespace that’s why we n…

C++ 内存基本构件new [] /delete []的意义、内存泄漏原因、VC下cookie的基本布局

目录一、对new [] delete [] 的理解1、delete的[]遗漏会带来什么影响二、以示例探讨三、cookie的理解一、对new [] delete [] 的理解 new的对象是个array类型的。 Complex* pca new Complex[3]; //唤起三次ctor //无法借由参数给予初值 ... delete[] pca; //唤起3次dtor如下…

OpenJudge计算概论-找出第k大的数

/* 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K&#xff0c;然后接着输入N个正整数&#xff08;无序的&#xff09;&#xff0c;程序在不对N个整数排序的情况下&#xff0c;找出第K大的数。注意&#xff0c;第K大的数意味着从大到小排在第K位的数。并…

01背包怎么不重复_带有重复物品的背包

01背包怎么不重复Problem statement: 问题陈述&#xff1a; Weights and values are given for n items along with the maximum capacity allowed W. What is the maximum value we can achieve if we can pick any weights, any number of times for the total allowed capa…

jQuery数组处理汇总

有段时间没写什么了, 打算把jquery中的比较常用的数组处理方法汇总一下 $.each(array, [callback])遍历,很常用 ?12345678var arr [javascript, php, java, c, c#, perl, vb, html, css, objective-c];$.each(arr, function(key, val) {// firebug consoleconsole.log(index …

C++ 内存基本构件 placement new

用法以及编译器解释 placement new 允许我们将object构建于已经分配的内存上。(所以此时必须有个指针指向已经分配好的内存) 没有所谓的placement delete &#xff0c;因为placement new根本没有分配内存. 也有种说法&#xff0c;是将placement new对应的内存释放掉的操作为pl…

二维数组for遍历

<?php$conarray(array(1,高某,A公司,北京市,010,abc),array(2,罗某,B公司,天津市,020,bcd),array(3,冯某,C公司,上海市,021,cdf),array(4,书某,D公司,重庆市,022,dfg));echo <table border"1" width"600" align"center">;echo <cap…

Xcode调试相关小结

一.设置NSZombieEnabled 使用NSZombieEnabled功能,当代码中访问已经释放了内存的地方,会给你下面这样的提示,而不仅仅是EXEC_BAD_ACCESS: 2008-10-03 18:10:39.933 HelloWorld[1026:20b] *** -[GSFont ascender]: message sent to deallocated instance 0x126550 如果要查看上面…

ONGC的完整形式是什么?

ONGC&#xff1a;石油天然气公司 (ONGC: Oil and Natural Gas Corporation) ONGC is an abbreviation of Oil and Natural Gas Corporation. It is an Indian multinational corporation that is one of the leading producers of crude oil and natural gas in India. Its hea…

C/C++代码优化方法

目录优化概述_O0优化_O1优化_O2优化_O3优化volatile关键字避免优化优化概述 如果将未经优化的C语言程序直接运行会发现运行效率较低&#xff0c;并且产生的代码较大&#xff0c;而通过优化可以较好地解决这些问题。 优化的作用是对循环进行化简&#xff0c;重新组织表达式和声…

大学生应当趁早谋划未来(二)--给表弟的建议

背景表弟&#xff0c;大四&#xff0c;湖北某二本院校&#xff0c;计算机相关专业。大学期间&#xff0c;对Java等编程没有兴趣&#xff0c;几乎没怎么学习。平时&#xff0c;课程比较多&#xff0c;每天6节左右。课外&#xff0c;自己去挣点生活费,父亲生病了。困境最近在找工…

UVa 490 - Rotating Sentences

把输入的字符顺时针旋转90度。 1 #include<stdio.h>2 #include<string.h>3 4 int main()5 {6 int i, j, max, n, m;7 char s[105][105];8 max0;9 memset(s, \0, sizeof(s)); 10 for (i0; gets(s[i]); i) 11 { 12 nstrlen(s[i]); 1…

node 大写_大写Node.js模块

node 大写Today, lets see a third party module that helps us in working with upper-case letters without necessarily typing them in upper-case in our source code. 今天&#xff0c;让我们看一个第三方模块&#xff0c;它可以帮助我们处理大写字母&#xff0c;而不必在…

1704:baoge的洗漱难题[黄]

baoge的洗漱难题[黄] Time Limit: 5000 ms Memory Limit: 65536 KB Total Submit: 79 Accepted: 21 Description众所周知&#xff0c;地大19楼的盥洗室非常小&#xff0c;所以经常会非常拥挤&#xff0c;很多时候去洗漱的时候不得不排很长的队。有时候baoge会排上半小时…

HDU嵌入式实验课程大作业分析报告

目录作业要求设计原理与思路扩展任务说明课程感受友情链接工程链接作业要求 体能测试记录仪设计 基于课程发放的实验板&#xff0c;设计一个带有计时和数据采集功能的体能测试记录仪。 基本设计内容 功能1&#xff1a;对应1000米体测场景&#xff0c;使用充电宝供电&#x…

COJ 1030 素数槽

http://acm.csu.edu.cn/OnlineJudge/problem.php?id1030 用线性筛素数果然快多了。 #include<cstdio> #include<cstring> #include<cstdlib> #define MAXN 1300000 bool is_p[MAXN];void calc() {for( int i 1; i < MAXN; i )is_p[i] true;is_p[1] fa…

html注释引用公共头部_HTML注释和引用

html注释引用公共头部HTML注释 (HTML Comments) To insert a comment in an HTML document, the comment tags are used. The comments are used to provide some information that could be useful for anyone who views the code of the webpage. The comments can be insert…