了解char数组内存分配

时间:2014-12-07 00:26:11

标签: c++

我似乎得到了与两个片段相同的结果。我只是有点困惑他们两个如何工作,我希望有一些见解,为什么会这样。

  1. 两个数组是否以相同的方式存储在内存中?
  2. 他们是否存在炒作?
  3. 我是否需要使用delete[]

  4. std::ifstream file

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

    VS

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

2 个答案:

答案 0 :(得分:2)

  1. nope,第一个变体使用堆栈,第二个变量 - 堆
  2. 见1)
  3. 仅适用于第二个变体

答案 1 :(得分: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,是,如果对象在堆上。