2017-04-22 83 views
0

所以,我很好奇這件事我不明白。如何正確刪除std :: stack中的指針?

我創造了一些新的對象,並將它們傳遞給它們存儲在一個std ::棧的功能。

然而,當我要刪除他們 - 他們實際上沒有被刪除,因此,內存使用量將繼續攀升「永遠」用我的測試循環。

爲什麼?

bool StateMachine::changeState(BaseState *state) { 
    if (state == nullptr) { 
     delete states.top(); 
     states.pop(); 
     if (states.size() == 0) { 
      return false; 
     } 
    } else if (state != states.top()) { 
     states.push(state); 
    } 
    return true; 
} 

測試循環:

while (true) { 
    machine.changeState(new MenuState); 
    machine.changeState(nullptr); 
} 

使用一個std ::的unique_ptr而不是原始的作品,現在RAM使用是恆定的,但還是 - 我想知道。

乾杯!

+0

您有未定義的行爲。如果你在一個空的'std :: stack'上調用'states.top()',你會得到未定義的行爲。 – Galik

+0

在初始化期間堆棧被填充,所以它永遠不會是空的。應該可能提到這一點。 – ludolover

+1

我在本地嘗試了一個稍微修改過的版本(以'int *'代替'BaseState *'+檢查空棧),在那裏我沒有泄漏內存(使用地址清理器運行)。 「BaseState」的析構函數可能沒有被聲明爲「虛擬」嗎? – Corristo

回答

1

你的代碼應該是正確的給你所提到的前提條件,但請注意,您可以分配和回收沒有操作系統分配的內存,特別是如果你留在內存分配孔刪除對象。因此,請檢查內存是否開始增長,然後停止並在內部泄漏內存,如BaseState內部。

如果您在約前提疑問是,在你如果和打印的東西添加一個else子句。我永遠不會發生,但如果它發生了,那麼調用states.top()可能會有一些問題。