2014-12-07 78 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. 第二只变种