欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C++中new運(yùn)算符和delete運(yùn)算符的使用

 更新時(shí)間:2016年01月25日 16:53:04   投稿:goldensun  
這篇文章主要介紹了C++中new運(yùn)算符和delete運(yùn)算符的使用,文章來(lái)自于微軟開(kāi)發(fā)者文檔,因而根據(jù)Visual C++的一些特性來(lái)進(jìn)行講解,需要的朋友可以參考下

C++ 支持使用 new 和 delete 運(yùn)算符動(dòng)態(tài)分配和釋放對(duì)象。這些運(yùn)算符為來(lái)自稱為“自由存儲(chǔ)”的池中的對(duì)象分配內(nèi)存。 new 運(yùn)算符調(diào)用特殊函數(shù) operator new,delete 運(yùn)算符調(diào)用特殊函數(shù) operator delete。
在 Visual C++ .NET 2002 中,標(biāo)準(zhǔn) C++ 庫(kù)中的 new 功能將支持 C++ 標(biāo)準(zhǔn)中指定的行為,如果內(nèi)存分配失敗,則會(huì)引發(fā) std::bad_alloc 異常。
如果內(nèi)存分配失敗,C 運(yùn)行庫(kù)的 new 函數(shù)也將引發(fā) std::bad_alloc 異常。
如果您仍需要 C 運(yùn)行庫(kù)的 new 的非引發(fā)版本,請(qǐng)將您的程序鏈接到 nothrownew.obj。但是,當(dāng)您鏈接到 nothrownew.obj 時(shí),標(biāo)準(zhǔn) C++ 庫(kù)中的 new 將不再起作用。

調(diào)用 new 運(yùn)算符
在程序中遇到以下語(yǔ)句時(shí),它將轉(zhuǎn)換為對(duì)函數(shù) operator new 的調(diào)用:

char *pch = new char[BUFFER_SIZE];

如果請(qǐng)求針對(duì)零字節(jié)存儲(chǔ),operator new 將返回一個(gè)指向不同的對(duì)象的指針(即對(duì) operator new 的重復(fù)調(diào)用將返回不同的指針)。如果分配請(qǐng)求沒(méi)有足夠的內(nèi)存,則 operator new 將返回 NULL 或引發(fā)異常(有關(guān)詳細(xì)信息,請(qǐng)參閱 )。
可以編寫(xiě)嘗試釋放內(nèi)存的例程并重試分配;有關(guān)詳細(xì)信息,請(qǐng)參閱 _set_new_handler。有關(guān)恢復(fù)方案的更多詳細(xì)信息,請(qǐng)參閱以下主題:處理內(nèi)存不足的情況。
下表中描述了 operator new 函數(shù)的兩個(gè)范圍。
operator new 函數(shù)的范圍

運(yùn)算符 范圍
::operator new 全局
class-name ::operator new 類(lèi)

operator new 的第一個(gè)參數(shù)的類(lèi)型必須為 size_t(STDDEF.H 中定義的類(lèi)型),并且返回類(lèi)型始終為 void *。
在使用 new 運(yùn)算符分配內(nèi)置類(lèi)型的對(duì)象、不包含用戶定義的 operator new 函數(shù)的類(lèi)類(lèi)型的對(duì)象和任何類(lèi)型的數(shù)組時(shí),將調(diào)用全局 operator new 函數(shù)。在使用 new 運(yùn)算符分配類(lèi)類(lèi)型的對(duì)象時(shí)(其中定義了 operator new),將調(diào)用該類(lèi)的 operator new。
為類(lèi)定義的 operator new 函數(shù)是靜態(tài)成員函數(shù)(因此,它不能是虛函數(shù)),該函數(shù)隱藏此類(lèi)類(lèi)型的對(duì)象的全局 operator new 函數(shù)??紤] new 用于分配內(nèi)存并將內(nèi)存設(shè)為給定值的情況:

// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>

class Blanks
{
public:
 Blanks(){}
 void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
 void *pvTemp = malloc( stAllocateBlock );
 if( pvTemp != 0 )
  memset( pvTemp, chInit, stAllocateBlock );
 return pvTemp;
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
 Blanks *a5 = new(0xa5) Blanks;
 return a5 != 0;
}

用括號(hào)包含的提供給 new 的參數(shù)將作為 Blanks::operator new 參數(shù)傳遞給 chInit。但是,全局 operator new 函數(shù)將被隱藏,從而導(dǎo)致以下代碼生成錯(cuò)誤:

Blanks *SomeBlanks = new Blanks;

在 Visual C++ 5.0 和早期版本中,使用 new 運(yùn)算符分配的非類(lèi)類(lèi)型和所有數(shù)組(無(wú)論其類(lèi)型是否為 class)始終使用全局 operator new函數(shù)。
從 Visual C++ 5.0 開(kāi)始,編譯器支持類(lèi)聲明中的成員數(shù)組 new 和 delete 運(yùn)算符。例如:

// spec1_the_operator_new_function2.cpp
class MyClass
{
public:
 void * operator new[] (size_t)
 {
  return 0;
 }
 void operator delete[] (void*)
 {
 }
};

int main() 
{
 MyClass *pMyClass = new MyClass[5];
 delete [] pMyClass;
}

處理內(nèi)存不足
對(duì)失敗的內(nèi)存分配進(jìn)行測(cè)試可以通過(guò)如下編碼實(shí)現(xiàn):

// insufficient_memory_conditions.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
#define BIG_NUMBER 100000000
int main() {
 int *pI = new int[BIG_NUMBER];
 if( pI == 0x0 ) {
  cout << "Insufficient memory" << endl;
  return -1;
 }
}

處理失敗的內(nèi)存分配要求的其他方法:編寫(xiě)自定義恢復(fù)例程來(lái)處理此類(lèi)失敗,然后通過(guò)調(diào)用 _set_new_handler 運(yùn)行時(shí)函數(shù)來(lái)注冊(cè)您的函數(shù)。
delete 運(yùn)算符
可使用 delete 運(yùn)算符釋放使用 new 運(yùn)算符動(dòng)態(tài)分配的內(nèi)存。delete 運(yùn)算符調(diào)用 operator delete函數(shù),該函數(shù)將內(nèi)存釋放回可用池。使用 delete 運(yùn)算符也會(huì)導(dǎo)致調(diào)用類(lèi)析構(gòu)函數(shù)(如果有)。
存在全局和類(lèi)范圍的 operator delete函數(shù)。只能為給定類(lèi)定義一個(gè) operator delete函數(shù);如果定義了該函數(shù),它會(huì)隱藏全局 operator delete函數(shù)。始終為所有類(lèi)型的數(shù)組調(diào)用全局 operator delete函數(shù)。
全局 operator delete函數(shù)(如果已聲明)采用 void * 類(lèi)型的單個(gè)參數(shù),該參數(shù)包含指向要釋放的對(duì)象的指針。返回類(lèi)型是 void(operator delete 無(wú)法返回值)。類(lèi)成員 operator delete 函數(shù)有兩種形式:

void operator delete( void * );
void operator delete( void *, size_t );

給定類(lèi)中只存在前面兩個(gè)變量中的一個(gè)。第一個(gè)形式按照為全局 operator delete 描述的那樣運(yùn)行。第二個(gè)形式采用兩個(gè)參數(shù),第一個(gè)是指向要釋放的內(nèi)存塊的指針,第二個(gè)是要釋放的字節(jié)的數(shù)量。當(dāng)基類(lèi)中的 operator delete 函數(shù)用于刪除派生類(lèi)的對(duì)象時(shí),第二個(gè)形式特別有用。
operator delete 函數(shù)是靜態(tài)的;因此它不能是虛函數(shù)。 operator delete 函數(shù)服從訪問(wèn)控制,如成員訪問(wèn)控制中所述。
以下示例顯示旨在記錄內(nèi)存的分配和釋放的用戶定義的 operator new 和 operator delete 函數(shù):

// spec1_the_operator_delete_function1.cpp
// compile with: /EHsc
// arguments: 3
#include <iostream>
using namespace std;

int fLogMemory = 0;  // Perform logging (0=no; nonzero=yes)?
int cBlocksAllocated = 0; // Count of blocks allocated.

// User-defined operator new.
void *operator new( size_t stAllocateBlock ) {
 static int fInOpNew = 0; // Guard flag.

 if ( fLogMemory && !fInOpNew ) {
  fInOpNew = 1;
  clog << "Memory block " << ++cBlocksAllocated
   << " allocated for " << stAllocateBlock
   << " bytes\n";
  fInOpNew = 0;
 }
 return malloc( stAllocateBlock );
}

// User-defined operator delete.
void operator delete( void *pvMem ) {
 static int fInOpDelete = 0; // Guard flag.
 if ( fLogMemory && !fInOpDelete ) {
  fInOpDelete = 1;
  clog << "Memory block " << cBlocksAllocated--
   << " deallocated\n";
  fInOpDelete = 0;
 }

 free( pvMem );
}

int main( int argc, char *argv[] ) {
 fLogMemory = 1; // Turn logging on
 if( argc > 1 )
  for( int i = 0; i < atoi( argv[1] ); ++i ) {
   char *pMem = new char[10];
   delete[] pMem;
  }
 fLogMemory = 0; // Turn logging off.
 return cBlocksAllocated;
}

前面的代碼可用于檢測(cè)“內(nèi)存溢出”,即在自由儲(chǔ)存中分配但從未釋放過(guò)的內(nèi)存。若要執(zhí)行此檢測(cè),則應(yīng)重新定義全局 new 和 delete 運(yùn)算符以計(jì)算內(nèi)存的分配和釋放。
從 Visual C++ 5.0 開(kāi)始,編譯器支持類(lèi)聲明中的成員數(shù)組 new 和 delete 運(yùn)算符。例如:

// spec1_the_operator_delete_function2.cpp
// compile with: /c
class X {
public:
 void * operator new[] (size_t) {
  return 0;
 }
 void operator delete[] (void*) {}
};

void f() {
 X *pX = new X[5];
 delete [] pX;
}

相關(guān)文章

  • 深入剖析C語(yǔ)言中qsort函數(shù)的實(shí)現(xiàn)原理

    深入剖析C語(yǔ)言中qsort函數(shù)的實(shí)現(xiàn)原理

    這篇文章主要介紹了C語(yǔ)言中qsort函數(shù)的實(shí)現(xiàn)原理,本文將從回調(diào)函數(shù),qsort函數(shù)的應(yīng)用,qsort函數(shù)的實(shí)現(xiàn)原理三個(gè)方面進(jìn)行講解,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • linux下C/C++學(xué)生信息管理系統(tǒng)

    linux下C/C++學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了linux下c/c++學(xué)生信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++實(shí)現(xiàn)LeetCode(172.求階乘末尾零的個(gè)數(shù))

    C++實(shí)現(xiàn)LeetCode(172.求階乘末尾零的個(gè)數(shù))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(172.求階乘末尾零的個(gè)數(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • FFmpeg中AVIOContext的使用方法詳解

    FFmpeg中AVIOContext的使用方法詳解

    AVIOContext是FFMPEG管理輸入輸出數(shù)據(jù)的結(jié)構(gòu)體,這篇文章主要為大家詳細(xì)介紹了這個(gè)結(jié)構(gòu)體的具體使用,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-08-08
  • C++實(shí)現(xiàn)航空訂票系統(tǒng)課程設(shè)計(jì)

    C++實(shí)現(xiàn)航空訂票系統(tǒng)課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)航空訂票系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言鏈表詳解及代碼分析

    C語(yǔ)言鏈表詳解及代碼分析

    這篇文章主要介紹了C語(yǔ)言鏈表詳解及代碼分析,說(shuō)明了鏈表的定義與概念,通過(guò)詳細(xì)的代碼展示了基于鏈表的增刪改查功能,希望本文能對(duì)你有所幫助
    2021-06-06
  • C++關(guān)于樹(shù)的定義全面梳理

    C++關(guān)于樹(shù)的定義全面梳理

    樹(shù)是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹(shù)中稱為結(jié)點(diǎn))按分支關(guān)系組織起來(lái)的結(jié)構(gòu),很象自然界中的樹(shù)那樣。樹(shù)結(jié)構(gòu)在客觀世界中廣泛存在,如人類(lèi)社會(huì)的族譜和各種社會(huì)組織機(jī)構(gòu)都可用樹(shù)形象表示,本篇介紹二叉樹(shù)的遞歸與非遞歸遍歷的方法
    2022-06-06
  • VisualStudio2022 cmake配置opencv開(kāi)發(fā)環(huán)境

    VisualStudio2022 cmake配置opencv開(kāi)發(fā)環(huán)境

    本文主要介紹了VisualStudio2022 cmake配置opencv開(kāi)發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • C語(yǔ)言實(shí)現(xiàn)掃雷小游戲的全過(guò)程記錄

    C語(yǔ)言實(shí)現(xiàn)掃雷小游戲的全過(guò)程記錄

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言實(shí)現(xiàn)掃雷小游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語(yǔ)言八大排序之堆排序

    C語(yǔ)言八大排序之堆排序

    堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)而設(shè)計(jì)的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時(shí)間復(fù)雜度均為O(nlogn),它也是不穩(wěn)定排序
    2022-02-02

最新評(píng)論