C ++ 03向量作为缓冲类

时间:2015-11-28 18:47:11

标签: 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 checkSomething() {
    std::vector<char> buff(SOMETHING_SIZE);
    int ret = 0;
    fillSomething(&buff[0]);
    /// Check data in buff and set ret value.
    ...
    ///
    return ret;
}

在呼叫删除之前从函数返回时防止出现这种情况。

问题:矢量使用的缺点是什么?我看到很多代码都使用new / delete,因此很容易使用std::vector

4 个答案:

答案 0 :(得分:4)

  

矢量使用的缺点是什么?我看到了许多带有new / delete的代码,其中很容易使用vector。

使用std::vector<char>实际上并没有缺点。

  

我认为使用vector会更安全(对开发者来说)。

你是对的。它只是用原始数组指针来替代它,并且根据维护大小和重新分配,至少任何适当的实现都需要与std::vector实现已经做的相同(这可能很难)避免所有潜伏的陷阱)。

在自定义实现中很容易出现new[] delete[]错误,但std::vector难以理解,这就是它从一开始就存在的原因C ++标准定义。

使用当前标准并假设SOMETHING_SIZE是常量值std::array应该是首选,如果缓冲区应该在堆栈上静态分配并且适合那里。

答案 1 :(得分:2)

这里的区别在于std::vector将释放其元素占用的内存,而你必须手动delete动态分配的数组,你碰巧做错了 - 应该有{ {1}}代替delete [],因为它是您要解除分配的数组。

不要忘记释放,以防你的函数提前返回/抛出异常可能会很痛苦。我们有RAII。

事实上,如果delete在编译时已知,std::array也将为您提供(可能更小的二进制)。

答案 2 :(得分:1)

  

我认为使用vector会更安全(对开发者来说)。

你是对的。

  

矢量使用的缺点是什么?

没有。

  

我看到很多带有new / delete的代码,其中很容易使用vector。

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

答案 3 :(得分:1)

我想指出中间解决方案,它更像原始new[] ... delete[]但是安全(不要求你记住解除分配) ,在有例外的情况下不会泄漏。)

那是:

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

auto buff = std::make_unique<char[]>(SOMETHING_SIZE);

它具有在运行时选择的大小(与std::array不同)。

不允许调整大小或复制。如果你想要那些,你应该向上移动到std::vector。但有时候你并不想要它们,std::unique_ptr<T[]>可以节省std::vector所需的额外开销,以便跟踪不同的大小。

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