2014-12-07 81 views
0

我似乎得到了與他們兩個片段相同的結果。我只是有點困惑,他們如何能夠工作,我希望有一些見解,爲什麼是這樣。瞭解字符數組內存分配

  1. 這兩個數組是否以相同的方式存儲在內存中?
  2. 他們是否存儲在炒作?
  3. 我需要使用delete[]嗎?

std::ifstream file

char buffer[bufferSize]; 
file->read(buffer, bufferSize); 

VS

char * buffer = new char[bufferSize]; 
file->read(buffer, bufferSize); 

回答

2

buffer第一個聲明創建堆棧上的靜態大小的緩衝區:此聲明的工作,bufferSize必須是一個編譯時間常數!那麼,一些編譯器確實有一個擴展來實現C的C++變長數組,但這不是可移植的(至少現在還沒有:還有一些關於在C++中創建類似特性的討論)。

buffer的第二個定義使用內存分配在堆上分配數組。除非你也delete[]緩衝區,你實際上有內存泄漏,即,你可能想使用類似

std::unique_ptr<char[]> buffer(new char[bufferSize]); 
file->read(buffer.get(), bufferSize); 

無論是原來的代碼片段的工作,因爲數組衰變爲指針,以他們的第一個元素上的第一次機會他們得到。這種行爲是從C繼承的。這種方法的主要區別是堆棧分配速度很快,但堆棧大小趨於相當有限(例如,在某些系統上,默認情況下只有48kB),而在堆上分配內存往往要慢一點,但大緩衝區通常不是問題。堆棧分配的內存在釋放函數時釋放,而堆分配的內存需要以某種形式存在時爲delete[]d。

要回答你貼後我主要是輸入上面的響應問題:

  1. 號:第一個是在棧上,二是在堆上。
  2. 否:第一個在棧上,第二個在堆上。
  3. 取決於:如果對象位於堆棧上,則爲no,如果對象位於堆棧上,則爲no。
+0

如何提倡'unique_ptr'而不是'vector'? – 2014-12-07 00:40:02

+0

所以堆棧有內存限制,不知道。認爲它只與它存在的範圍有關.48kb與我所需要的不同。我正在閱讀的二進制文件可能比那個大100倍。我想我需要在堆上存儲。堆棧溢出時是否有錯誤或異常? – superhero 2014-12-07 00:41:37

+0

@MattMcNabb:'std :: vector'如何釋放堆中分配的數組? :-)更嚴重的是,如果你只需要一個動態大小的本地數組,'std :: unique_ptr '實際上是一個合理的選擇,儘管如果我需要一個數組,我個人可能只是使用'std :: vector '。 – 2014-12-07 00:42:43

2
  1. 不,第一變型中使用棧,第二個 - 堆
  2. 參見圖1)
  3. 第二隻變種