2016-01-20 121 views
1

我正在使用C++ 11。我意識到我可以做到這一點,並在堆棧上分配:C++ 11堆棧分配vs Unique_Ptr

void someclasS::somefn(int naz) { 
    Ipp32f absValues[naz] // <--naz is dynamic 
    //.....more code 
    //..... 
} 

我以爲我不應該能夠做到這一點? 以前我是這樣做的:

std::unique_ptr<Ipp32f[]> absValues(new Ipp32f[naz]); 
// when need to pass pointer have to use absValues.get() 

爲了避免必須刪除內存。

我很想做前者,如果可能的話,因爲它看起來更整潔。但是,如果有的話會有什麼後果?

+0

是的。在這裏看,編譯和工作。使用帶有std11標誌的gcc的eclipse。 – lppier

回答

3

它的工作原理,因爲編譯器接受VLAs甚至如果它們在C++中不是標準的。

正常的方法是使用std::vector,如Humam Helfawi所說。

不允許VLA的基本原理是,要麼你確定沒有堆棧溢出,因爲大小上有一個上限(在這種情況下只是分配這個大小),或者數量是無限的,你確實應該分配它在免費商店,因爲這可以更好地處理內存不足的情況。

+0

你說什麼上限?多少? – lppier

+0

嗨..我讀過它通常是4mb左右...這很小。 – lppier

+0

@lppier:我的意思是,如果你確實知道說'n <= 100',那麼在棧上分配一個'int [n]'是相當安全的,但在這種情況下,你可以只分配'int [ 100]'而不需要VLA。另一方面,如果'n'沒有上限,那麼可能在堆棧上分配'int [n]'是一個壞主意,因爲堆棧溢出是未定義的行爲,而空閒存儲區上的內存耗盡而是正確地發送信號。 – 6502

2

我很想做前者如果可能的話,因爲它看起來整潔

只需使用std::vector

std::vector<Ipp32f> absValues(naz); 

結果是連續的,如果你有這個聲明的函數:

ppsZero_32f(Ipp32f* ptr, int len); 

你可以通過你的載體是這樣的:

ppsZero_32f(absValues.data(),absValues.size()); 
+0

結果會在內存中連續嗎?我需要將absValue傳遞給ipps樣式函數。 ippsZero_32f(Ipp32f * ptr,int len) – lppier

+0

當然是連續的 –

+0

我使用std :: unique_ptr var(ippsMalloc_32f(az),ippsFree);宣佈,這個矢量相當於什麼? – lppier