首页 > 解决方案 > C++ 中的 char* buffer = new vs char buffer[]

问题描述

1. char* buffer = new char[size]
2. char buffer[size]

我是 C++ 新手,我看到大多数地方都使用第一个示例创建缓冲区。我知道在第一种方法中,可以传递那部分内存中的数据,直到使用delete[]. 使用第二种方法时,缓冲区的生命周期取决于范围。如果我只计划通过特定功能持续使用缓冲区并且我不打算将其传递给其他任何东西,那么我使用哪种方法是否重要?

标签: c++

解决方案


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


推荐阅读