c++ - C++ 中的 char* buffer = new vs char buffer[]
问题描述
1. char* buffer = new char[size]
2. char buffer[size]
我是 C++ 新手,我看到大多数地方都使用第一个示例创建缓冲区。我知道在第一种方法中,可以传递那部分内存中的数据,直到使用delete[]
. 使用第二种方法时,缓冲区的生命周期取决于范围。如果我只计划通过特定功能持续使用缓冲区并且我不打算将其传递给其他任何东西,那么我使用哪种方法是否重要?
解决方案
char* buffer = new char[size]
这是可移植的,但应该避免。在你真正知道自己在做什么之前,new
直接使用几乎总是一个错误(当你知道自己在做什么时,它仍然是一个错误,但你会在不被告知的情况下知道这一点)。
char buffer[size]
这取决于您如何定义size
. 如果它是一个常数(并且相当小),那么这没关系。如果它不是一个常数,那么任何正常运行的编译器都需要拒绝它(但一些常见的编译器无论如何都会接受它)。
如果它是常量但“大”,编译器将接受代码,但当您尝试执行它时可能会失败。在这种情况下,任何超过一百万的东西通常都太大了,超过几十万左右的东西就会变得可疑。
但是有一个例外:如果它是在任何函数之外定义的(即,作为全局变量),那么它可以安全地比局部变量大得多。同时,我觉得有必要指出,我认为全局变量是通常应该避免的东西(而且我远非一个人持有这种观点)。
另请注意,这两者(或多或少)是互斥的:如果size
是一个常量,您通常希望避免动态分配,但它必须是一个常量才能定义一个数组(同样,使用正常运行的编译器)。
除非size
是相当小的常数,大多数时候你应该避免这两个。您最可能想要的是:
std::string buffer;
或者:
std::vector<char> buffer(size);
或者可能:
std::array<char, size> buffer;
其中前两个可以为缓冲区动态分配空间,但通常保持分配“隐藏”,因此您通常不需要直接处理它。与,std::array
非常相似char buffer[size]
(例如,具有固定大小,并且确实适用于相当小的大小),但强制大小必须是 const,并为您提供与vector
(减去任何会改变的内容) 大致相同的界面元素的数量,因为这是std::array
) 的常数。
推荐阅读
- sql - sql 表达式 SUM(col1 + col2) / COUNT(1) 其他解决方法
- algorithm - 带有 if-else 块的 for 循环的时间复杂度
- python - Django:将项目保存到数据库,ForeignKey 混淆
- r - LMM 的似然比检验给出的 P 值为 1?
- drupal-8 - Drupal 8:如何在自定义模块中更改块中的内容
- javascript - Javascript转
我正在尝试将我的 <c: out 值转换为 Javascript 日期,但是当我尝试它时,我不断收到无效的日期。这是我试图变成 Javascript dateTime 的字符串。
24-02-2021 17:34:27
我通过执行以下操作获得此值:
va
- java - 背景图片itextpdf 5.5
- vue.js - bootstrap-vue 如何在 b-dropdown 中包含 b-form-datepicker
- windows - How to Change the My Computer Desktop Icon Using Powershell?
- python - 多进程不停止请求输入,返回错误