簡體   English   中英

內存分配運算符和表達式

[英]Memory allocation operators and expressions

在C ++中,'new'是一個運算符還是一個表達式或某種關鍵字? 我想到一個類似的問題是,我應該將'='稱為運算符或表達式嗎?

C ++分離了內存分配和對象生存期的概念。 這是與C相比的新特性,因為在C中,對象等同於其內存表示(在C ++中稱為“POD”)。

一個對象在構造函數完成時開始它的生命,它的生命在析構函數完成時結束。 對於動態存儲持續時間的對象,生命周期因此包括四個關鍵里程碑:

  1. 內存分配。
  2. 對象構造。
  3. 對象破壞。
  4. 內存釋放。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM