char*buffer=new与C+中的char buffer[]+; 我是C++的新手,我看到大多数地方使用第一个例子创建缓冲区。我知道在第一种方法中,在使用delete[]手动删除之前,该部分内存中的数据可以一直传递。在使用第二种方法时,缓冲区的生存期取决于作用域。如果我只计划缓冲区在一个特定函数中持续,而不计划将它传递给其他任何东西,那么使用哪种方法重要吗 1. char* buffer = new char[size] 2. char buffer[size]

char*buffer=new与C+中的char buffer[]+; 我是C++的新手,我看到大多数地方使用第一个例子创建缓冲区。我知道在第一种方法中,在使用delete[]手动删除之前,该部分内存中的数据可以一直传递。在使用第二种方法时,缓冲区的生存期取决于作用域。如果我只计划缓冲区在一个特定函数中持续,而不计划将它传递给其他任何东西,那么使用哪种方法重要吗 1. char* buffer = new char[size] 2. char buffer[size],c++,C++,这是便携式的,但应该避免。在你真正知道自己在做什么之前,直接使用new几乎总是一个错误(当你确实知道自己在做什么时,这仍然是一个错误,但你会知道这一点而不被告知) 这取决于您如何定义size。如果它是一个常数(并且相当小),那么这是正确的。如果它不是一个常量,那么任何正常运行的编译器都需要拒绝它(但一些常见的编译器无论如何都会接受它) 如果它是常量,但“大”,编译器将接受代码,但当您尝试执行它时,它可能会失败。在这种情况下,任何超过一百万的东西通常都太大,而任何超过几十万的东西都是可疑的 但有一

这是便携式的,但应该避免。在你真正知道自己在做什么之前,直接使用
new
几乎总是一个错误(当你确实知道自己在做什么时,这仍然是一个错误,但你会知道这一点而不被告知)

这取决于您如何定义
size
。如果它是一个常数(并且相当小),那么这是正确的。如果它不是一个常量,那么任何正常运行的编译器都需要拒绝它(但一些常见的编译器无论如何都会接受它)

如果它是常量,但“大”,编译器将接受代码,但当您尝试执行它时,它可能会失败。在这种情况下,任何超过一百万的东西通常都太大,而任何超过几十万的东西都是可疑的

但有一个例外:如果这是在任何函数之外定义的(即,作为全局变量),那么它可以安全地比局部变量大得多。同时,我不得不指出,我把全局变量看作是一个通常应该避免的东西(而且我远不是单独持有这种观点)。 还请注意,这两者(或多或少)是互斥的:如果
size
是一个常量,则通常希望避免动态分配,但它必须是一个常量才能定义数组(同样,使用功能正常的编译器)

除非
size
是一个相当小的常数,否则大多数情况下,您应该避免这两种情况。您最可能想要的是:

char buffer[size]
或:

std::向量缓冲区(大小);
或者可能:

std::vector<char> buffer(size);
std::数组缓冲区;

前两种方法可以动态地为缓冲区分配空间,但通常会使分配保持“隐藏”,因此通常不需要直接处理它。
std::array
char buffer[size]
非常相似(例如,它有一个固定的大小,并且非常适合非常小的大小),但是强制要求大小必须是常量,并提供与
vector
大致相同的接口(减去任何会改变元素数量的变量,因为这是
std::array
的常数)。

主要区别在于第一个变量是动态分配,而第二个变量不是。当编译时不知道需要多少内存时,需要动态分配。这意味着不完全是常数,但在运行时根据外部输入进行计算

使用在内部处理动态内存的容器是一种很好的做法,这样可以确保您不必手动删除,而手动删除往往是错误和内存泄漏的来源。 一个用于所有类型数据的通用动态容器是
std::vector
(别忘了
#包括

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

当您不使用原始数据类型,而是使用自己的类来存储大量数据时,这种良好做法有一个主要的例外。原因是
std::vector
在调整大小时执行复制操作(数据越大,复制操作的成本越高)。 但是,一旦你在C++项目中走了那么远,你就应该知道“智能指针”了,这就是那些特殊情况下的安全解决方案。
顺便说一下,使用
&向量[0]
(向量中第一个元素的地址)您可以得到一个指针,它与char数组非常相似,因此可以用于不直接接受向量的旧函数。

最大的区别是考虑在抛出异常时会发生什么。用第一个例子处理异常的安全方法是使用智能指针……大小编译时间值i?F不仅1;或者等价是可能的。如果<代码>大小<代码>是一个变量(例如,它不计算到编译时常数),那么第二个窗体是一个可变长度数组——它不是标准C++(它是由一些但不是全部C++编译器支持的非标准扩展)。。需要注意的是:
std::array
对大小的限制与堆栈上的原始数组相同。好吧,这是有道理的。因此,如果我在某个地方看到
char*buffer=new
,它更多地与历史保留有关,而不是与性能相关的任何事情。@Krunkenstein非常重要。在某些情况下,数组我会比字符串更快,但只有当你有诸如低级网络或从/到GPU传输数据这样的东西时,才真正值得冒险。你应该知道什么时候值得冒险。现在即使在网络中,也不值得冒险了,因为很多漏洞都是通过原始内存访问(如指针)发生的在网络代码中。例如,查看heartbleed bug。顺便说一句,查看我对上面的响应所做的小小补充。
std::string buffer;
std::vector<char> buffer(size);
std::array<char, size> buffer;