2015-03-25 44 views
-13
string *ptr = new string("Hello"); 

當我們呼叫新運營商時會發生什麼?簡單點解釋。「新」和「運營商新」之間的關係

+4

我非常懷疑你的問題是一個很適合這個網站。請參考:http://stackoverflow.com/help/how-to-ask。禮貌也有幫助。 – 2015-03-25 07:40:51

+1

你自己研究了什麼,你究竟知道些什麼?由於這是一個相當初級的問題,我假設你正在從[好書](http://stackoverflow.com/q/388242/1782465)或教程中學習。它是如何解釋的以及該解釋的哪些部分不清楚? – Angew 2015-03-25 07:46:37

回答

0
​​

新的運營商主要做了兩兩件事:

  1. 它分配足夠的存儲空間來保存請求的類型的對象。 (在上例中,它分配足夠的內存來容納此字符串對象)

    1. 它調用一個構造函數來初始化已分配內存中的對象。

現在這個「新」是調用哪個函數?

它是運營商新的。

void * operator new (size_t size); 

返回類型是void *。 由於此函數返回一個指向raw的指針,該指針未被鍵入並且未初始化的內存足夠大以容納指定類型的對象。 size_t指定分配多少內存。

如果我們直接調用operator new,它會返回一個指向足夠容納一個字符串對象的內存塊的指針。

void *pointRawMemory = operator new(sizeof(string)); 

運算符new類似於malloc。它只負責分配內存。它對構造函數一無所知。 「新」運算符的工作是採用運算符新返回並將其轉換爲對象的原始內存。

0

一個字符串對象被分配在動態存儲區中並且它的構造函數被調用(接收const char *的那個)。

然後,該構造函數的結果(對象的地址)被放入ptr變量中,該變量可能存在於許多不同的存儲區之一(如靜態存儲區或堆棧中),具體取決於聲明實際上在你的代碼中是

這就是所有你需要知道的一切,「在...下」,這是一個實現細節。

根據operator newnew之間的差異,前者在較低的抽象層次上運行,只是簡單地分配足夠的內存來存儲某些內容,而不調用任何構造函數。