[英]Memory allocation operators and expressions
在C ++中,'new'是一個運算符還是一個表達式或某種關鍵字? 我想到一個類似的問題是,我應該將'='稱為運算符或表達式嗎?
C ++分離了內存分配和對象生存期的概念。 這是與C相比的新特性,因為在C中,對象等同於其內存表示(在C ++中稱為“POD”)。
一個對象在構造函數完成時開始它的生命,它的生命在析構函數完成時結束。 對於動態存儲持續時間的對象,生命周期因此包括四個關鍵里程碑:
C ++中動態分配內存的標准方法是使用global ::operator new()
,並使用::operator delete()
釋放。 但是,要構造一個對象,只有一個方法:一個新的表達式 :
T * p = new T;
這種新表達式的最常見形式是一步完成分配和構造。 它相當於細分版本:
void * addr = ::operator new(sizeof(T));
T * p = new (addr) T; // placement-new
同樣, 刪除表達式 delete p;
首先調用析構函數然后釋放內存。 它相當於:
p->~T();
::operator delete(addr);
因此, 默認的 new和delete表達式在一次清洗中執行內存分配和對象構造。 新表達式的所有其他形式(統稱為“placement new”)在構造對象之前調用相應的placement-new 運算符來分配內存。 但是,沒有匹配的“放置刪除表達式”,並且必須使用p->~T();
手動銷毀使用placement-new創建的所有動態對象p->~T();
。
總之,將新表達式與operator new區分開來非常重要。 這實際上是C ++中內存管理的核心。
這就是所有這些。
2.13表4明確地將new
列為關鍵字。
5.3.4介紹new-expression
。 這是一個表達式,例如new int(5)
,它使用new
關鍵字,類型和初始值。
5.3.4 / 8然后聲明調用operator new
來為new-expression創建的對象分配內存
=
工作完全一樣。 每個類都有一個operator=
(除非明確刪除),它在賦值表達式中使用。 我們通常稱a=5;
只是一個賦值,即使它在技術上是“包含賦值表達式的表達式語句”。
新的是運營商。 你可以重載它並編寫自己的版本。 另外我認為=是運營商。 表達式是更復雜的東西,包括運算符,變量,函數調用等。請嘗試獲得C ++語言標准。 它必須描述你提到的所有事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.