c++ - 函数 new char[size] vs char[size] 上的动态内存
问题描述
所以我有这个函数,它有一个带有预定义缓冲区的字符串(缓冲区是在调用函数时定义的)。
我的问题是,为什么当我执行以下操作时编译器不会向我抛出错误(没有 new 运算符?):
int crc32test(unsigned char *write_string, int buffer_size){
// Append CRC32 to string
int CRC_NBYTES = 4;
int new_buffer_size = buffer_size + CRC_NBYTES; // Current buffer size + CRC
// HERE (DECLARATION OF THE STRING)
unsigned char appendedcrc_string[new_buffer_size];
return 0;
}
这不是正确的方法吗..?
int crc32test(unsigned char *write_string, int buffer_size){
// Append CRC32 to string
int CRC_NBYTES = 4;
int new_buffer_size = buffer_size + CRC_NBYTES; // Current buffer size + CRC
// HERE (DECLARATION OF THE STRING USING NEW)
unsigned char * appendedcrc_string = new unsigned char[new_buffer_size+1];
delete[] appendedcrc_string ;
return 0;
}
我实际上编译了两者,并且都有效。为什么编译器没有向我抛出任何错误?如果显然前一个功能也有效,是否有理由使用 new 运算符?
解决方案
第一个代码格式错误,但是一些编译器默认为接受非标准扩展的模式。
您应该能够为标准一致性指定编译器开关。例如,在 gcc 中,-std=c++17 -pedantic
.
第二个代码是“正确的”,虽然也不是首选方式,但您应该使用一个容器,当执行离开范围时释放内存,而不是手动删除。例如,std::vector<unsigned char> buf(new_buffer_size + 1);
。
推荐阅读
- google-bigquery - 出现错误太多位置参数,在创建 bigquery 聚集表时仍然存在
- python - PySide:是否可以绘制平滑线 QPainter?
- django - 如何在 django 查询集中使用 concat 和 chr 函数?
- sql-server - 如何在 SQL Server Management Studio 中移动列?
- asp.net - 无法在 asp.net 的视图状态中存储类型的 IEnumerable 的值
- php - Laravel 排队作业,在其执行时间之前执行它
- r - 将线性模型公式应用于分组数据
- android - 我想缩放android uri文件
- php - laravel 表单不会在提交时提交给控制器
- powershell - 组合参数集