char* 缓冲区 = C++ 中的新 vs char 缓冲区 []

  • 本文关键字:char 缓冲区 vs C++ c++
  • 更新时间 :
  • 英文 :

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::arraychar buffer[size]非常相似(例如,具有固定的大小,并且确实适用于相当小的尺寸(,但强制大小必须是常量,并为您提供与vector大致相同的接口(减去任何会改变元素数量的内容,因为这是std::array的常数(。

主要区别在于第一个变体是动态分配,而第二个不是。当您在编译时不知道需要多少内存时,您需要动态分配。这意味着当"大小"不完全是一个常量,而是根据外部输入在运行时以某种方式计算时。

最好使用在内部处理动态内存的容器¹,从而确保您不必手动删除,这通常是错误和内存泄漏的来源。 用于各种数据的通用动态容器是std::vector<char>(不要忘记#include <vector>(

但是,如果您确实处理文本,请使用类std::string,它也在内部处理内存。原始char*数组是旧 C 的余数。

¹当您不使用原始数据类型而是使用自己的类来存储大量数据时,这种良好做法有一个主要的例外。原因是std::vector<>在调整大小时执行复制操作(数据越大,这些操作的成本就越高(。 但是,一旦您在C++项目中取得了如此进展,那么您应该了解"智能指针",这是这些特殊情况的安全解决方案。

顺便说一下,使用&the_vector[0](向量中第一个元素的地址(,您可以获得一个行为与 char 数组非常相似的指针,因此可用于不直接接受向量的旧函数。

最新更新