了解字符数组内存分配
Understanding char array memory allocation
我似乎得到了两个片段相同的结果。我只是有点困惑它们是如何工作的,我希望对为什么会这样有一些见解。
- 两个数组在内存中的存储方式是否相同?
- 他们是否存储在炒作中?
- 我需要使用
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[]
。
回答您在我大部分输入上述回复后发布的问题:
- 否:第一个在堆栈上,第二个在堆上。
- 否:第一个在堆栈上,第二个在堆上。
- 取决于:如果对象在堆栈上,则为 no,如果对象在堆上,则为 no。
- 不,第一个变体使用堆栈,第二个变体 - 堆
- 见1(
- 仅适用于第二个变体
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?