2012-11-25 179 views
4

我正在使用C++ std向量來存儲渲染對象,用於簡單的場景圖實現。我需要能夠在運行時從場景圖中添加和刪除渲染對象.Adding不是問題,爲了消除:閱讀向量和其他C++容器的文檔,看起來當對象被彈出時,它們的析構函數被調用。這不是我需要的,因爲我希望能夠稍後將這些對象重新添加到渲染循環中。是否可以解決這個問題? 重要細節我忘記提及 - 我正在使用指向渲染對象的向量。從C++容器中刪除對象而不刪除它們

+3

存儲從其他地方管理的對象的智能指針。 – juanchopanza

+2

刪除它們之前不會複製它們是一種解決方案嗎?或者,在C++ 11的情況下,將它們移出? – jogojapan

+1

@juanchopanza我會說「智能指針」或「從其他地方管理」,看不出這兩者如何混合。 – Kos

回答

7

看起來你很迷惑對象實例的基本概念。當你添加了一些爲向量,你不將其移動到它,你把它複製:

vector<string> vec; 
string s; 
vec.push_back(s); 

vec[0]s,它是s副本。所以當你從矢量中刪除它時,s而不是受到影響。

如果你不想要副本,你應該切換到指針。你可以從vector中移除指針,它們指向的對象的析構函數將不會被調用。

編輯: 好吧,看來你已經在使用指針了。你說:

矢量和其他C++集裝箱閱讀文檔,似乎當 對象被彈出他們的析構函數被稱爲

這是事實。當你從向量中移除一個指針時,指針正在被破壞。這就是文檔的意思。這並不意味着要被被破壞掉的對象指針指向:

vector<string*> vec; 
string s; 
vec.push_back(&s); 
vec.pop_back(); 

s完全沒有受到影響。流行操作破壞的是指針,其地址爲s,而不是s本身。

所以你很好。

+0

是的,我知道它:)我忘了提及我正在使用指針向量。 –

+1

@MichaelIV:指針會被銷燬,但是他們指向的東西不會。 (只要你正確地管理被指向的對象的生命週期,你就沒事了)。 – Mankarse

+2

@MichaelIV然後你沒有問題;當你從向量中移除指針時,只有指針被銷燬,而不是指針指向的對象。 –

3

您需要注意所有權才能使其正常工作。如果您使用的矢量只是臨時的,只能觀察對象,則只需使用點矢量即可。

std::vector<object*> x; 

銷燬該vector指向的對象不受影響。

如果要共享所有權,請使用boost::shared_ptrstd::shared_ptr

2

當指針被彈出時,不會調用析構函數。從概念上講,即使是原始類型也有析構函數,以解釋當它們超出範圍時會發生什麼。銷燬指針向量與使一堆本地指針變量超出範圍相同。

引用計數智能指針是過載運算符*->的對象,其行爲與指針類似。他們確實實施了析構函數來銷燬指向對象,從而實現所有權。但對於場景圖,這可能是不必要的。

相關問題