最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 使用new與delete需注意的原則

 更新時間:2020年08月11日 11:56:51   作者:Dabelv  
這篇文章主要介紹了C++ 使用new與delete需注意的原則,幫助大家更好的理解和學習c++,感興趣的朋友可以了解下

C++的動態(tài)內(nèi)存管理是通過new和delete兩個操作來完成的,即用new來申請空間,用delete來釋放空間。在使用new和delete時,注意以下原則。

1.new與delete需一一對應

用new操作申請空間,如果申請成功,必須在以后的某個時刻用delete釋放該空間,既不能忘記釋放,也不能多次釋放。前者會引起內(nèi)存泄露,后者會引起運行時錯誤。如下面的程序。

#include <iostream>
using namespace std;

int main()
{
	int *p;
	p=new int(3);
	if(p)
	{
		delete p;
	}
	delete p;
	return 0;
}

以上程序?qū)χ羔榩所指向的空間進行兩次釋放,這種內(nèi)存錯誤對C++程序危害極大,也是很多人對C++忘而卻步的原因。多次釋放同一塊內(nèi)存空間,并不一定立即引起程序運行錯誤,也不一定會導致程序運行的崩潰,這跟具體的編譯器實現(xiàn)有關。但是,多次釋放同一塊內(nèi)存空間絕對是一個編程錯誤,這個編程錯誤可能會在其后的某個時刻導致其他的邏輯錯誤的發(fā)生,從而給程序的調(diào)試和糾錯帶來困難??疾烊缦鲁绦颉?/p>

#include <iostream>
using namespace std;

int main()
{
	int *p,*q,*one;
	one=new int;
	if(one)
	{
		cout<<one<<endl;
	}
	delete one;
	p=new int(3);
	if(p)
	{
		cout<<p<<endl;
	}
	delete one;//假設這句語句是程序員不小心加上的
	q=new int(5);
	if(q)
	{
		cout<<q<<endl;
	}
	cout<<(*p)+(*q)<<endl;
	delete p;
	delete q;
}

程序通過編譯,運行結果如下:

003289A0
003289A0
003289A0
10

程序運行過程中會產(chǎn)生中斷。從程序的輸出可以看出,在將指針one所指向的空間釋放后,為指針p申請的空間就是原來one所指向的空間。由于不小心在為p分配空間之后再次使用了delete one,導致q申請到的空間就是原來p所申請的空間,這樣賦給*q的值就改寫了原來p所指向的單元的值,導致最后輸出結果為10。由此可知,多次釋放同一塊內(nèi)存空間,即使不導致程序運行中斷,也會破壞環(huán)境,使指針與所對應的空間的隸屬關系出現(xiàn)混亂,從而導致邏輯錯誤。在大型程序設計中,這種邏輯錯誤的查找會變得十分費時費力。

**注意:**當指針p的值為NULL時,多次使用delete p并不會帶來麻煩,因為釋放空指針的空間實際上不會導致任何操作。所以,將“不用”的指針設置為NULL是一個好的編程習慣。

2.new[]與delete[]需一一對應

在申請對象數(shù)組時,需要使用new[]運算符,與之對應,釋放對象數(shù)組時,需要使用delete[]運算符。這一點與C語言有所區(qū)別,C中無論申請單個還是多個對象,均使用malloc()/free()函數(shù)。首先看一下delete與delete[]運算符的區(qū)別。

class Test 
{
public:
	Test() { cout<<"ctor"<<endl; }
	~Test() { cout << "dtor" << endl; }
};

//segment1
Test* pArray1 = new Test[3];
delete pArray1;

//segment2
Test* pArray2 = new Test[3];
delete[] pArray2;

其中代碼片段segment1運行結果如下:

ctor
ctor
ctor
dtor

segment2運行結果如下:

ctor
ctor
ctor
dtor
dtor
dtor

可以看出,delete與delete[]區(qū)別在于釋放對象數(shù)組時,delete只調(diào)用了一次析構函數(shù),delete[]調(diào)用了三次析構函數(shù),完成了對象數(shù)組的釋放。實際上,在使用new和new[]申請內(nèi)存空間時,會申請一段額外的內(nèi)存來保存用戶申請的內(nèi)存空間大小,元素個數(shù)等信息。當使用delete[]釋放內(nèi)存空間時,會逐個調(diào)用對象的析構函數(shù)并完成最終的內(nèi)存空間的釋放。使用delete釋放對象數(shù)組時,則只會調(diào)用單個對象的析構函數(shù),造成內(nèi)存泄漏。符號[]告訴編譯器,在delete一塊內(nèi)存時,先去獲取內(nèi)存保存的元素個數(shù),然后一一清理。所以使用delete釋放new[]申請的內(nèi)存空間和使用delete[]釋放new申請的內(nèi)存空間都錯誤的做法。

具體使用時,需要注意以下兩點:

 (1)對于內(nèi)置數(shù)據(jù)類型,因為沒有構造和析構函數(shù),所以使用delete和delete[]的效果是一樣的。比如:

int* pDArr=new int[3];
//processing code
delete pDArr;	//等同于delete[] pDArr

對于內(nèi)置數(shù)據(jù)類型,雖然可以使用delete完成對象數(shù)組內(nèi)存空間的釋放,但是為了保證代碼的可讀性,建議使用delete[]來完成。所以,new[]與delete[]使用時應一一對應。

(2)對于經(jīng)常使用typedef的程序員來說,很容易new[]與delete的混用,例如有如下操作:

typedef int Height[NUM];
int* pHeight=new Height;

這個情況應該使用delete還是delete[]呢?答案如下:

delete	pHeight;		//wrong,但容易錯誤地使用delete
delete[] pHeight;	//right

為了避免出現(xiàn)上面的錯誤,建議不要對數(shù)組使用typedef,或者采用STL中的vector代替數(shù)組。

3.構造函數(shù)中的new/new[]與析構函數(shù)的中delete/delete[]需一一對應

當類的成員中有指針變量時,在構造函數(shù)中用new申請空間并且在析構函數(shù)中用delete釋放空間是一種“標準的”、安全的做法。例如下面的程序。

#include <iostream>
using namespace std;

class Student
{
	char* name;
public:
	Student()
	{
		cout<<"Default constructor"<<endl;
	}
	Student(char*);
	~Student();
};

Student::Student(char*s)
{
	//Student();//此句運行時報錯,構造函數(shù)不能調(diào)用其他構造函數(shù)
	cout<<"In constructor,allocating space"<<endl;
	name=new char[strlen(s)+1];
	strcpy(name,s);
	cout<<"name:"<<name<<endl;
}

Student::~Student()
{
	cout<<"In destructor, free space"<<endl;
	delete name;
}

int main()
{
	Student s1("張三");
}

程序運行輸出:

In constructor,allocating space
name:張三
In destructor, free space

由于任何一個對象,其構造函數(shù)只調(diào)用一次,其析構函數(shù)也只調(diào)用一次,這樣就能保證運行時new和delete操作是一一對應的,也就保證了內(nèi)存管理的安全性。

在C++中,一個構造函數(shù)不能調(diào)用本類的另一個構造函數(shù),其原因就是為了防止構造函數(shù)的相互調(diào)用打破了內(nèi)存申請與釋放之間的這種對應關系。

以上就是C++ 使用new與delete需注意的原則的詳細內(nèi)容,更多關于C++ new與delete的資料請關注腳本之家其它相關文章!

相關文章

  • 一篇文章讓你輕松理解C++中vector和list區(qū)別

    一篇文章讓你輕松理解C++中vector和list區(qū)別

    對于學c語言的同學來說,vector和list這兩個東西經(jīng)常會搞錯,下面這篇文章主要給大家介紹了關于C++中vector和list區(qū)別的相關資料,需要的朋友可以參考下
    2022-01-01
  • C++基于Directx MMX實現(xiàn)的圖像灰度轉換代碼

    C++基于Directx MMX實現(xiàn)的圖像灰度轉換代碼

    這篇文章主要介紹了C++基于Directx MMX實現(xiàn)的圖像灰度轉換代碼,需要的朋友可以參考下
    2014-08-08
  • C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法

    C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法

    這篇文章主要介紹了C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • QT設計秒表功能(跑步計時器)

    QT設計秒表功能(跑步計時器)

    這篇文章主要為大家詳細介紹了QT設計秒表功能,跑步計時器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++實現(xiàn)LeetCode(156.二叉樹的上下顛倒)

    C++實現(xiàn)LeetCode(156.二叉樹的上下顛倒)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(156.二叉樹的上下顛倒),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 一起來學習C++的函數(shù)指針和函數(shù)對象

    一起來學習C++的函數(shù)指針和函數(shù)對象

    這篇文章主要為大家詳細介紹了C++函數(shù)指針和函數(shù)對象,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++學習筆記之淺談異常處理

    C++學習筆記之淺談異常處理

    C++ 提供了異常機制,讓我們能夠捕獲運行時錯誤,本文就詳細的介紹了C++異常處理入門,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 一問了解C++ 的移動語義

    一問了解C++ 的移動語義

    本文主要介紹C++ 的移動語義,移動語義并不是一個容易理解的概念,很多程序員可能對其存在一定的疑惑,今天我們就來探討一下 C++ 中的移動語義
    2023-04-04
  • C語言 數(shù)據(jù)結構堆排序順序存儲(升序)

    C語言 數(shù)據(jù)結構堆排序順序存儲(升序)

    這篇文章主要介紹了C語言 數(shù)據(jù)結構堆排序順序存儲(升序)的相關資料,需要的朋友可以參考下
    2017-05-05
  • C++之&與*符號用法案例詳解

    C++之&與*符號用法案例詳解

    這篇文章主要介紹了C++之&與*符號用法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論

宜宾县| 永清县| 曲沃县| 泌阳县| 景东| 滕州市| 顺平县| 三河市| 安阳市| 临潭县| 肃宁县| 武功县| 英吉沙县| 临武县| 隆尧县| 保定市| 通海县| 巨鹿县| 同仁县| 麻城市| 房产| 射阳县| 巩义市| 青海省| 宣恩县| 华蓥市| 涿鹿县| 阳泉市| 高要市| 保德县| 垫江县| 寿阳县| 稻城县| 渝中区| 封丘县| 绥棱县| 景谷| 利津县| 大英县| 普格县| 新源县|