了解字符数组内存分配

Understanding char array memory allocation

本文关键字:分配 内存 数组 字符 了解      更新时间:2023-10-16

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

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

std::ifstream file

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

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

buffer的第一个声明在堆栈上创建一个静态大小的缓冲区:要使此声明正常工作,bufferSize必须是编译时常量!好吧,一些编译器也确实有一个扩展来实现 C 的可变长度C++数组,但它不是可移植的(至少,现在还没有:也有一些关于在 C++ 中创建类似功能的讨论(。

buffer的第二个定义使用内存分配在堆上分配数组。除非你也delete[]缓冲区,否则你实际上有一个内存泄漏,即,你可能想使用类似的东西

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

这两个原始代码片段都有效,因为数组在第一次有机会时会衰减为指向其第一个元素的指针。此行为继承自 C。

两种方法之间的主要区别在于堆栈分配速度很快,但堆栈大小往往相当有限(例如,在某些系统上默认情况下只有 48kB(,而在堆上分配内存往往有点慢,但大缓冲区通常不是问题。堆栈分配的内存在函数退出时释放,而堆分配的内存需要以某种形式delete[]

回答您在我大部分输入上述回复后发布的问题:

  1. 否:第一个在堆栈上,第二个在堆上。
  2. 否:第一个在堆栈上,第二个在堆上。
  3. 取决于:如果对象在堆栈上,则为 no,如果对象在堆上,则为 no。
  1. 不,第一个变体使用堆栈,第二个变体 - 堆
  2. 见1(
  3. 仅适用于第二个变体