2016-04-20 40 views
0

我正在製作一個工具來解決this,儘管我被代碼本身大規模地拖延了。刪除一個函數創建的數組

在各個地方我有返回(指向)數組的函數。大多數時候這些函數都是遞歸的,而在內部調用中創建的數組可能稍後沒用。

我試過用delete[];即使編譯器沒有抱怨,並且程序運行良好,我可以看到正在分配大量的內存。 的代碼看起來是這樣的:(?或者什麼都沒有)

template <typename Type> Type* foo(unsigned short size,...) 
{ 
    //... 
    Type *tmp; 
    //... 
    tmp=foo(param,...); 
    //... 
    delete[] tmp; 
    //... 
} 

然後我問自己,如果,當陣列被創造出來的範圍,delete[]實際刪除所有已分配的內存或僅僅是第一指標。

我改寫了這段代碼看起來像這樣:

template <typename Type> Type* foo(unsigned short size,...) 
{ 
    //... 
    Type *tmp; 
    //.. 
    tmp = new Type[i]; 
    tmp = foo(param,...); 
    //... 
    delete[] tmp; 
    //... 
} 

內存消耗降低了,但我很快就意識到,該陣列我創建之前調用foo(...)實際上並沒有被刪除...永遠。

所以最後我想:

template <typename Type> Type* foo(unsigned short size,...) 
{ 
    //... 
    Type *tmp, *dump; 
    //.. 
    dump = tmp = new Type[i]; 
    tmp = foo(param,...); 
    delete[] dump; 
    //... 
    delete[] tmp; 
    //... 
} 

但我只是移動的問題又進了一步,並在此過程中創造另一個陣列。不出所料(儘管不是真的)內存消耗猛增。這裏

的問題是:

  • 我如何解決這個問題?
  • 爲什麼內存消耗會隨着第一次更改而降低?

我真的不希望使用std::vector因爲重寫所有相關的代碼似乎是一個重大的任務,因爲,作爲一個新秀,我有種感覺好多知道我並不需要一個圖書館的幫助下寫我的程序(顯然我仍然在使用它們;我無法想象寫入如<iostream>這樣的東西)。

PS:我的代碼在GitHub

PPS:我爲我的英語道歉;不是母語人士。這裏沒有魔法 -

+0

如果分配與'new'你'delete'釋放它的內存,如果你用'新[]'然後分配用'delete []'釋放(如果你有一些舊的C函數,用'malloc'或'calloc'分配,然後使用'free')。何時何地分配發生並不重要。 –

+0

還有一個更簡單的解決方案來解決你的問題,這將使整個問題都沒有意義:['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。每當你想到「動態數組」或「運行時分配數組」或類似的東西時,你應該總是考慮['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。 –

+0

我可能會使用'std :: vector',實際上我已經使用它了,因爲程序本身計算了某些數組的大小,而使用本地數組會使我運行一大堆代碼;首先要計算大小,然後填寫數據。 –

回答

1
What is the correct way to do this? 

你應該配對new T[]delete[]。爲確保正確使用,請使用std:unique_ptr<T[]> - 陣列版本。或 - 標準::矢量,但你說你不喜歡它。

Why did memory consumption lowered with the first change? 

似乎ilogical,你分配更多的內存和它下降....

我看了一下你的github上的項目,我發現this

delete[] slhs, srhs;    //Deletes the now useless sorted arrays. 

刪除[]不列表刪除數組,據我記得只有srhs將被釋放。你應該寫:

delete[] srhs; 
delete[] slhs; 

找到其他地方像這樣,或使用std::unique_ptr<>

+0

非常感謝,我會盡快了解這些智能指針。完成修改後,我會進行更新。 –

+0

所以我嘗試了兩個;使用'unique_ptr'並找到用列表調用delete []的實例。實際上,我用'unique_ptr'獲得的內存消耗最低,但是,現在性能下降了,運行具有相同參數的程序需要多次。 –

相關問題