c++ - 了解 char 数组内存分配

标签 c++

我似乎用这两个片段得到了相同的结果。我只是有点困惑它们是如何工作的,我希望能得到一些关于其中原因的见解。

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

std::ifstream 文件

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

VS

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

最佳答案

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

buffer 的第二个定义使用内存分配在堆上分配数组。除非您还删除[]缓冲区,否则实际上会发生内存泄漏,即,您可能想要使用类似的东西

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

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

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

回答您在我输入上面的回复后发布的问题:

  1. 否:第一个位于堆栈上,第二个位于堆上。
  2. 否:第一个位于堆栈上,第二个位于堆上。
  3. 取决于:如果对象位于堆栈上则否,如果对象位于堆上则为是。

关于c++ - 了解 char 数组内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27338173/

相关文章:

c++ - 谈论套接字时的同步和异步术语

c++ - cin后程序无响应>>

c++ - 数组转换指导

c++ - DDS纹理加载

c++ - 什么会导致 "corrupted double-linked list"错误?

c++ - 模板模板部分特化仅适用于 -std=c++1z 和 g++

c++ - 如何使用埃拉托色尼筛法改进我的素数程序?

c++ - 尝试在 Dll main 中创建线程

c++ - 类 <template-parameter-1-2> 的默认参数的重新定义

c++ - C编译器是否有义务在内存中放置一个静态常量?