C++ C++;03向量作为缓冲类

C++ C++;03向量作为缓冲类,c++,arrays,vector,C++,Arrays,Vector,这是非常普遍的情况: int checkSomething() { char *buff = new char[SOMTHING_SIZE]; int ret = 0; fillSomething(buff); /// Check data in buff and set ret value. ... /// delete [] buff; return ret; } 我认为使用vector(对于开发人员)会更安全: int ch

这是非常普遍的情况:

int checkSomething() {
    char *buff = new char[SOMTHING_SIZE];
    int ret = 0;
    fillSomething(buff);
    /// Check data in buff and set ret value.
    ...
    ///
    delete [] buff;
    return ret;
}
我认为使用vector(对于开发人员)会更安全:

int checkSomething() {
    std::vector<char> buff(SOMETHING_SIZE);
    int ret = 0;
    fillSomething(&buff[0]);
    /// Check data in buff and set ret value.
    ...
    ///
    return ret;
}
int checkSomething(){
std::向量buff(大小);
int-ret=0;
填充某物(&buff[0]);
///检查buff中的数据并设置ret值。
...
///
返回ret;
}
它可以防止在调用delete之前从函数返回时出现这种情况

问题:使用向量的缺点是什么?我看到了很多使用
new
/
delete
的代码,在那里使用
std::vector
很容易

使用向量的缺点是什么?我看到了很多使用new/delete的代码,这些代码很容易使用vector

使用
std::vector
实际上没有缺点

我认为使用vector(对于开发人员)会更安全

你说得对。它只是被设计成用原始数组指针来替代这个功能,并且至少任何适当的实现都需要按照std::vector实现的大小和重新分配来做(这可能很难避免所有潜在的陷阱)

<> P>在C++实现中很容易得到<代码>新[]/Cux>代码> Dele[][C]/COD>错误,但是很难失败,<>代码> STD::vector < /代码>这就是它从C++标准定义的开始存在的原因。
在当前标准下,如果缓冲区应该静态分配在堆栈上并且适合堆栈,那么假设
某物大小
是一个常量,那么
std::array
甚至应该是首选

使用向量的缺点是什么?我看到了很多使用new/delete的代码,这些代码很容易使用vector

使用
std::vector
实际上没有缺点

我认为使用vector(对于开发人员)会更安全

你说得对。它只是被设计成用原始数组指针来替代这个功能,并且至少任何适当的实现都需要按照std::vector实现的大小和重新分配来做(这可能很难避免所有潜在的陷阱)

<> P>在C++实现中很容易得到<代码>新[]/Cux>代码> Dele[][C]/COD>错误,但是很难失败,<>代码> STD::vector < /代码>这就是它从C++标准定义的开始存在的原因。

在当前标准下,如果缓冲区应该静态地分配在堆栈上,并且适合堆栈,并且假定
SOMETHING\u SIZE
是一个常量,那么
std::array
应该是首选的。

这里的区别是
std::vector
将释放其元素占用的内存,然而,您必须手动
删除
动态分配的数组,而您恰好以错误的方式执行此操作-应该有
删除[]
而不是
删除
,因为您正在解除分配的是一个数组

不要忘记取消分配,以防您的函数提前返回/抛出异常可能会很麻烦。我们已经有了雷伊


事实上,
std::array
如果在编译时知道
something\u SIZE
,那么它也可以为您服务(可能使用较小的二进制文件)。

这里的区别是
std::vector
将释放其元素占用的内存,而您必须手动
删除动态分配的数组,您碰巧做得不对-应该有
delete[]
而不是
delete
,因为您正在释放的是一个数组

不要忘记取消分配,以防您的函数提前返回/抛出异常可能会很麻烦。我们已经有了雷伊

事实上,
std::array
如果在编译时知道
SOMTHING\u SIZE
的话,它也可以为您服务(使用可能更小的二进制文件)

我认为使用vector(对于开发人员)会更安全

你说得对

使用向量的缺点是什么

没有

我看到了很多使用new/delete的代码,这些代码很容易使用vector

是的,世界上有很多可怕的代码

我认为使用vector(对于开发人员)会更安全

你说得对

使用向量的缺点是什么

没有

我看到了很多使用new/delete的代码,这些代码很容易使用vector


是的,世界上有很多可怕的代码。

我想指出中间解决方案,它的作用更像原始的
新[]
删除[]
,但它是安全的(不需要记住解除分配,在出现异常时不会泄漏)

即:

std::unique_ptr<char[]> buff{new char[SOMETHING_SIZE]};
std::unique_ptr buff{new char[SOMETHING_SIZE]};

auto buff=std::使_唯一(某物大小);
它具有在运行时选择的大小(不同于
std::array

它不允许调整大小或复制。如果您想要这些,应该向上移动到
std::vector
。但有时您并不需要它们,而且
std::unique\u ptr
节省了
std::vector
跟踪不同大小所需的额外开销


请注意,这些都是在C++11(和C++14,用于
make_unique
)中标准化的,但也可以在C++03中构建。

我想指出中间解决方案,它的作用更像原始的
new[]
delete[]
,但它是安全的(不要求您记住解除分配,在出现异常时不会泄漏)

即:

std::unique_ptr<char[]> buff{new char[SOMETHING_SIZE]};
std::unique_ptr buff{new char[SOMETHING_SIZE]};

auto buff=std::使_唯一(某物大小);
它具有在运行时选择的大小(不同于
std::array

它不允许调整大小或cop