2014-02-13 186 views
0

我有一個C++代碼的麻煩,在這部分代碼中某處丟失了內存。 我對C++不太好,請幫忙。我想創建數組的隊列,但是在這段代碼中有一些錯誤。C++隊列內存泄漏

const size_t _queueSize; 
size_t _queueBack; 
size_t width; 
size_t height; 
u_char** _history; 

.... 

    if (_queueBack) { 
     for (int i = _queueBack; i > 0; --i) { 
      _history[i] = _history[i-1]; 
     } 
    } 
    if (_queueSize == _queueBack) { 
     delete[] _history[_queueSize + 1]; 
     _history[0] = new u_char [height*width]; 
    } else { 
     ++_queueBack; 
    } 

P.S.我無法使用STL我需要快速隊列。

+0

所有這些原始指針都是一種災難處方在取消它的資格之前,您是否困擾過標準庫隊列分析? – StoryTeller

+5

根據「我對C++不太好」,我會重新考慮「我無法使用STL,我需要快速隊列」。你能夠實現一個比std :: queue更有效的隊列的機會對我來說似乎很低。 –

+0

不,我不知道,但我確定我需要低級別的數組。我逐個像素地處理原始圖像,所以我認爲STL將是非生產性的。 – Dmitriy

回答

0

您可以使用valgrind檢查您的泄漏,內存泄漏可以在代碼中的其他位置生成,並在該位置「爆炸」。

順便說一句,我堅信你應該使用STL,如果你需要某種特殊的要求與內存實現你自己的分配器。我懷疑你能達到比STL更好的解決方案,那是人們最常犯的錯誤或傳說之一,STL不慢,它是你使用它的方式。

+0

我正在爲iOS開發,混合使用C,C++和Obj-C代碼。 xcode analizer找不到任何錯誤。 btw Obj-C容器很慢,所以我決定使用愛情級別的解決方案。 – Dmitriy

+0

如果是iOS版本,則不能使用Valgrind,它不再起作用:/。我真的不知道如果這是好的,但'刪除[] _history [_queueSize + 1];'這似乎是錯的權利?我的意思是,如果你的隊列有10個元素,你不能刪除_history [10]或_history [11]。 – Raistmaj

+3

@Dmitriy你會驚訝'std :: queue >'會執行多快,特別是對於位移和移動語義。你使用的叮噹聲3.3是好的,所以給它一個鏡頭。 – WhozCraig