首页 > 解决方案 > 函数 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 运算符?

标签: c++new-operatordynamic-memory-allocation

解决方案


第一个代码格式错误,但是一些编译器默认为接受非标准扩展的模式。

您应该能够为标准一致性指定编译器开关。例如,在 gcc 中,-std=c++17 -pedantic.

第二个代码是“正确的”,虽然也不是首选方式,但您应该使用一个容器,当执行离开范围时释放内存,而不是手动删除。例如,std::vector<unsigned char> buf(new_buffer_size + 1);


推荐阅读