我似乎得到了与两个片段相同的结果。我只是有点困惑他们两个如何工作,我希望有一些见解,为什么会这样。
delete[]
? std::ifstream file
char buffer[bufferSize];
file->read(buffer, bufferSize);
VS
char * buffer = new char[bufferSize];
file->read(buffer, bufferSize);
答案 0 :(得分:2)
答案 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。
在我主要输入上述回复后,回答您发布的问题: