首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为缓冲类的C++03向量

作为缓冲类的C++03向量
EN

Stack Overflow用户
提问于 2015-11-28 18:47:10
回答 4查看 100关注 0票数 1

这是非常普遍的情况:

代码语言:javascript
复制
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;
}

我认为(对于开发人员)使用向量会安全得多:

代码语言:javascript
复制
int checkSomething() {
    std::vector<char> buff(SOMETHING_SIZE);
    int ret = 0;
    fillSomething(&buff[0]);
    /// Check data in buff and set ret value.
    ...
    ///
    return ret;
}

它防止在调用delete之前从函数返回的情况。

问:矢量用法的缺点是什么?我看到了很多关于new/delete的代码,在这些代码中可以很容易地使用std::vector

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-11-28 18:55:20

矢量使用的缺点是什么?我看到了很多新的/删除的代码,其中很容易使用向量。

实际上,使用std::vector<char>并没有什么坏处。

我认为使用向量将更加安全(对于开发人员)。

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

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

对于当前的标准,假设SOMETHING_SIZE是一个常量值,std::array甚至应该是首选的,如果缓冲区应该静态地分配到堆栈上,并且适合那里。

票数 4
EN

Stack Overflow用户

发布于 2015-11-28 18:55:51

这里的不同之处在于,std::vector将释放占用其元素的内存,而您必须手动释放动态分配的数组,而这恰好是您做错了的--应该是delete []而不是delete,因为它是您正在释放的数组。

不要忘记取消分配,以防函数提前返回/抛出异常可能会带来痛苦。我们为此找了RAII。

事实上,如果在编译时知道std::array,那么SOMTHING_SIZE也会为您提供同样好的服务(可能还有更小的二进制文件)。

票数 2
EN

Stack Overflow用户

发布于 2015-11-28 19:02:35

我认为使用向量将更加安全(对于开发人员)。

你是对的。

矢量使用的缺点是什么?

根本就没有。

我看到了很多新的/删除的代码,其中很容易使用向量。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33975092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档