这是非常普遍的情况:
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;
}我认为(对于开发人员)使用向量会安全得多:
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。
发布于 2015-11-28 18:55:20
矢量使用的缺点是什么?我看到了很多新的/删除的代码,其中很容易使用向量。
实际上,使用std::vector<char>并没有什么坏处。
我认为使用向量将更加安全(对于开发人员)。
你说得对。它只是被设计成用原始数组指针来代替这一点,而且至少任何适当的实现(根据维护大小和重新分配)都需要像std::vector实现那样做(这可能很难避免所有潜在的陷阱)。
在自定义实现中很容易出错new[] delete[],但是std::vector很难失败,这就是为什么它从C++标准定义一开始就存在的原因。
对于当前的标准,假设SOMETHING_SIZE是一个常量值,std::array甚至应该是首选的,如果缓冲区应该静态地分配到堆栈上,并且适合那里。
发布于 2015-11-28 18:55:51
这里的不同之处在于,std::vector将释放占用其元素的内存,而您必须手动释放动态分配的数组,而这恰好是您做错了的--应该是delete []而不是delete,因为它是您正在释放的数组。
不要忘记取消分配,以防函数提前返回/抛出异常可能会带来痛苦。我们为此找了RAII。
事实上,如果在编译时知道std::array,那么SOMTHING_SIZE也会为您提供同样好的服务(可能还有更小的二进制文件)。
发布于 2015-11-28 19:02:35
我认为使用向量将更加安全(对于开发人员)。
你是对的。
矢量使用的缺点是什么?
根本就没有。
我看到了很多新的/删除的代码,其中很容易使用向量。
是的,世界上有很多可怕的代码。
https://stackoverflow.com/questions/33975092
复制相似问题