亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++中new運算符和delete運算符的使用

2020-05-23 14:09:09
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++中new運算符和delete運算符的使用,文章來自于微軟開發者文檔,因而根據Visual C++的一些特性來進行講解,需要的朋友可以參考下
 

C++ 支持使用 new 和 delete 運算符動態分配和釋放對象。這些運算符為來自稱為“自由存儲”的池中的對象分配內存。 new 運算符調用特殊函數 operator new,delete 運算符調用特殊函數 operator delete。
在 Visual C++ .NET 2002 中,標準 C++ 庫中的 new 功能將支持 C++ 標準中指定的行為,如果內存分配失敗,則會引發 std::bad_alloc 異常。
如果內存分配失敗,C 運行庫的 new 函數也將引發 std::bad_alloc 異常。
如果您仍需要 C 運行庫的 new 的非引發版本,請將您的程序鏈接到 nothrownew.obj。但是,當您鏈接到 nothrownew.obj 時,標準 C++ 庫中的 new 將不再起作用。

調用 new 運算符
在程序中遇到以下語句時,它將轉換為對函數 operator new 的調用:

char *pch = new char[BUFFER_SIZE];

如果請求針對零字節存儲,operator new 將返回一個指向不同的對象的指針(即對 operator new 的重復調用將返回不同的指針)。如果分配請求沒有足夠的內存,則 operator new 將返回 NULL 或引發異常(有關詳細信息,請參閱 )。
可以編寫嘗試釋放內存的例程并重試分配;有關詳細信息,請參閱 _set_new_handler。有關恢復方案的更多詳細信息,請參閱以下主題:處理內存不足的情況。
下表中描述了 operator new 函數的兩個范圍。
operator new 函數的范圍

運算符 范圍
::operator new 全局
class-name ::operator new

 

 

 

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

// 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 0xa5int main(){ Blanks *a5 = new(0xa5) Blanks; return a5 != 0;}

用括號包含的提供給 new 的參數將作為 Blanks::operator new 參數傳遞給 chInit。但是,全局 operator new 函數將被隱藏,從而導致以下代碼生成錯誤:

Blanks *SomeBlanks = new Blanks;

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

// spec1_the_operator_new_function2.cppclass MyClass{public: void * operator new[] (size_t) {  return 0; } void operator delete[] (void*) { }};int main() { MyClass *pMyClass = new MyClass[5]; delete [] pMyClass;}

處理內存不足
對失敗的內存分配進行測試可以通過如下編碼實現:

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

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

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

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

// 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;}

前面的代碼可用于檢測“內存溢出”,即在自由儲存中分配但從未釋放過的內存。若要執行此檢測,則應重新定義全局 new 和 delete 運算符以計算內存的分配和釋放。
從 Visual C++ 5.0 開始,編譯器支持類聲明中的成員數組 new 和 delete 運算符。例如:

// spec1_the_operator_delete_function2.cpp// compile with: /cclass X {public: void * operator new[] (size_t) {  return 0; } void operator delete[] (void*) {}};void f() { X *pX = new X[5]; delete [] pX;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看国产欧美| 亚洲国产免费av| 2021久久精品国产99国产精品| 欧美精品久久久久久久久| 国产精品av电影| 91色p视频在线| 日韩视频在线免费观看| 粉嫩老牛aⅴ一区二区三区| 欧美精品18videos性欧美| 日韩电影大全免费观看2023年上| 欧美影院在线播放| 日韩欧美在线视频观看| 国产精品一区二区久久国产| 国产精品中文字幕在线| 亚洲国产精品美女| 成人免费观看网址| 亚洲最新av在线网站| 黑人巨大精品欧美一区免费视频| 2019中文字幕在线免费观看| 一区二区三区四区视频| 成人av电影天堂| 精品久久久国产精品999| 日韩欧美在线第一页| 亚洲a中文字幕| 国产精品入口夜色视频大尺度| 精品视频在线观看日韩| 米奇精品一区二区三区在线观看| 91精品视频网站| 亚洲精品欧美极品| 日韩中文理论片| 亚洲精品99久久久久| 九九精品在线播放| 国产成人精品在线观看| 亚洲已满18点击进入在线看片| 精品激情国产视频| 久久视频在线免费观看| 日韩欧美国产高清91| 狠狠色狠色综合曰曰| 懂色av影视一区二区三区| 欧美激情在线一区| 欧美极品xxxx| 国产精品久久久久久久久久久久久久| 欧美性猛交xxxx黑人猛交| 91高清视频免费观看| 81精品国产乱码久久久久久| 狠狠躁夜夜躁人人爽天天天天97| 亚洲电影第1页| 国产欧美 在线欧美| 日韩欧美主播在线| 91精品在线观看视频| 日韩在线视频观看正片免费网站| 日本欧美爱爱爱| 欧美精品www| 亚洲影院色无极综合| 久久久久久久久中文字幕| 国产精品扒开腿做爽爽爽的视频| 亚洲精品成人av| 亚洲女人天堂成人av在线| 国产成人精品在线视频| 国产精品一区二区av影院萌芽| 日韩在线精品一区| 国产亚洲欧美另类中文| 国产色婷婷国产综合在线理论片a| 91亚洲人电影| www.日韩免费| 一本色道久久88精品综合| 综合欧美国产视频二区| 日韩精品亚洲视频| 成人黄色午夜影院| 精品久久久久久国产| 亚洲激情中文字幕| 日韩美女主播视频| 久久久久久久久久久人体| 亚洲欧美日韩中文视频| 国产精品免费久久久久影院| 岛国av一区二区| 亚洲欧美激情四射在线日| 久久久久久综合网天天| 黑人狂躁日本妞一区二区三区| 国产精品视频精品| 伊人久久男人天堂| 色综合五月天导航| 国产精品扒开腿做爽爽爽视频| 亚洲欧美国产制服动漫| 国产欧美一区二区三区久久| 久久视频这里只有精品| 亚洲另类xxxx| 欧美日韩在线视频首页| 日韩av一区二区在线观看| 成人黄色片在线| 欧洲成人免费aa| 欧美国产日韩一区二区| 国产精品欧美激情在线播放| 国产精品亚洲网站| 国产97在线视频| 欧美日韩成人在线播放| 亚洲一品av免费观看| 2021久久精品国产99国产精品| 久久亚洲国产精品成人av秋霞| 欧美大成色www永久网站婷| 色av吧综合网| 亚洲精品大尺度| 国产成人精品视频在线| 91精品国产网站| 欧美性猛交xxxx乱大交极品| 国产99久久精品一区二区永久免费| 亚洲三级av在线| 琪琪亚洲精品午夜在线| 欧美理论电影在线观看| 孩xxxx性bbbb欧美| 欧美中文字幕第一页| 久久人91精品久久久久久不卡| 亚洲精品一区二区久| 精品国产网站地址| 国产精品国语对白| 亚洲色图狂野欧美| 国产精品96久久久久久| 亚洲精品欧美极品| 国产91精品黑色丝袜高跟鞋| 日韩免费在线电影| 亚洲精品国产精品国产自| 欧美国产在线电影| 日韩亚洲一区二区| 国产精品中文久久久久久久| 久99九色视频在线观看| 中文字幕日韩免费视频| 国产亚洲视频在线观看| 欧美日韩性视频在线| 国产97免费视| 久久精品99久久久久久久久| 日韩中文字幕不卡视频| 久久精品视频免费播放| 成人国产亚洲精品a区天堂华泰| 国产精品第三页| 精品国产一区二区在线| 奇米一区二区三区四区久久| 欧美亚洲在线观看| www.亚洲人.com| 色先锋久久影院av| 日韩免费在线免费观看| 欧美在线视频在线播放完整版免费观看| 亚洲欧美制服综合另类| 日本一欧美一欧美一亚洲视频| 日av在线播放中文不卡| 久久免费视频观看| 国产精品自拍小视频| 亚洲视频在线播放| 亚洲精品成人网| 欧美日韩国产黄| 成人亚洲欧美一区二区三区| 欧美日韩激情美女| 欧洲亚洲在线视频| 精品久久久久久中文字幕大豆网| 69久久夜色精品国产7777| 欧美成人精品在线播放| 美女撒尿一区二区三区| 96sao精品视频在线观看| 欧美大尺度激情区在线播放| 欧美wwwxxxx| 亚洲高清不卡av| 欧美在线性视频| 色综合久久88| 69久久夜色精品国产7777| 中文字幕国产亚洲|