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.pswp.cn/news/377516.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377516.shtml
英文地址,請注明出處:http://en.pswp.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…