2013-07-13 67 views
1

我是C++的新手。我一直在shared_ptr保持分離的指針到單獨的引用計數器變量。但是今天,我突然意識到實際上我不知道它是如何佈置的,並且參考值不需要在C++中有分離的指針。如何配置shared_ptr引用計數器?

如果佈局是由標準定義的,std::shared_ptr的預期佈局是什麼?

+1

該標準沒有爲大多數類定義「佈局」(例如,所需的數據成員),「std :: shared_ptr」就是其中之一。它只需要一定的行爲,其中包括一些成員函數和非成員函數的存在。 – dyp

+0

@DyP你可以重寫這個答案嗎?這樣我可以選擇它。 – Eonil

+3

除了接受和正確的答案,這裏是一些ascii藝術,顯示典型的shared_ptr佈局:http://stackoverflow.com/questions/8645835/cpp-make-shared-for-void-pointers/8646062#8646062 –

回答

2

C++標準沒有爲任何非標準佈局類定義應該如何將其佈置在內存中,例如, [class.mem]/13

具有相同訪問控制(第11章)的(非聯合)類的非靜態數據成員被分配,以便後面的成員在類對象中擁有更高的地址。未指定具有不同訪問控制的非靜態數據成員的分配順序(第11章)。執行對齊要求可能會導致兩個相鄰成員不能立即分配;所以可能需要管理虛擬功能(10.3)和虛擬基類(10.1)的空間。

有標準佈局類型有些例外/簡化,但沒有一般規範類的內存佈局。

這也適用於標準庫中的類。除此之外,標準只定義了這些類的要求,其中一些是成員函數簽名意義上的「接口」。非常明確地在[objects.within.classes]中:

1)條款18到30和附錄D [標準庫]不指定類的表示,故意省略類成員的說明(9.2)。一個實現可以根據需要定義靜態或非靜態類成員,或兩者,以實現在第18章至第30章和附錄D中指定的成員函數的語義。

2)某些類的對象有時需要它們的類的外部規範來存儲數據,顯然在成員對象中。爲了便於說明,一些子條款爲滿足類的外部規範的類的私有成員對象提供代表性聲明和語義要求。對於這樣的成員對象和相關成員類型定義的聲明之後,只有擁有博覽會作爲結束,在註釋:

streambuf* sb; // exposition only 

這就是說,一些言論所需功能的std::shared_ptr

  • 你需要存儲的引用計數爲擁有對象,其中包含此所有權信息(DYN。ALLOC一個動態分配的對象。因爲目前還不清楚這shared_ptr是拉斯維加斯並且這最後一個必須釋放它)
  • 您還需要存儲使用weak_ptr的此所有權信息對象的引用計數,如​​和weak_ptr::lock等。可能不失敗(通過訪問衝突,例如)

迂腐側備註:標準不要求shared_ptr內存泄漏,但對於PC式架構而一個典型的實施將可能使用動態內存分配。

std::make_shared順便說一句被認爲是比使用的std::shared_ptr的構造函數更快,因爲它可以分配爲雙方所擁有的對象,並在一個分配所有權信息對象的內存(標準說「實現應該不是一個內存中執行不分配「,儘管這只是一個備註)。

相關問題