gpt4 book ai didi

c++ - 函数 new char[size] 与 char[size] 上的动态内存

转载 作者:行者123 更新时间:2023-11-27 22:39:29 25 4
gpt4 key购买 nike

所以我有这个函数,它有一个带有预定义缓冲区的字符串(缓冲区是在调用函数时定义的)。

我的问题是,为什么每当我执行以下操作(没有 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++,但可以在某些版本的 GCC 和 CLang 中使用...它绝对不可移植。

有几个选项可供选择:

  • 使用std::string<unsigned char>供您输入和s.append(reinterpret_cast<unsigned char*>(crc), 4);
  • 同样,您可以使用 std::vector<unsigned char>
  • 如果您只需要一个简单的可调整大小的缓冲区,您可以使用std::unique_ptr<unsigned char[]>。并使用 memcpy & std::swap等将数据移动到调整大小的缓冲区,然后释放旧缓冲区。
  • 作为创建临时缓冲区的非可移植替代方案,alloca()函数通过调整堆栈指针来开辟一个缓冲区。它不能很好地与 C++ 功能配合使用,但如果非常小心地确保该函数永远不会抛出异常,则可以使用它。
  • 将 CRC 与缓冲区存储在如下结构中

    struct input {
    std::unique_ptr<unsigned char[]> buffer;
    uint32_t crc;
    }

    并处理 CRC 的串联并在代码中的其他地方缓冲(即输出)。我认为这是最好的方法。

关于c++ - 函数 new char[size] 与 char[size] 上的动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50311927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com